python - 唯一导入 * 只允许在模块级别

标签 python syntax-error python-import

我正在制作一个内置多个程序的实用程序,但我对我的程序进行了一些更改,以便在用户提示时重新运行,然后由于某种原因,我遇到了错误

import * only allowed at module level

这是我的代码

def main():
    
    import os
    import sys
    import time
    import pywhatkit as whatsapp
    from speedtest import Speedtest
    from tkinter import *
    from tkinter import messagebox
    from os import listdir
    from PIL import Image

    print("*"*30)
    print("Utility Build v1: Starting")
    print("*"*30)

    time.sleep(3)

    print("NOTE: Before using this program for repairing corrupted disk, please locate this utility .py file into the corrupted storage. Thanks")

    time.sleep(3)

    print("*"*30)
    print("*"*30)
    print("Commands: Choose by inputting allocated number")

    print("Utility 1: Speed Test")
    print("Utility 2: Whatsapp Message Automation")
    time.sleep(2)
    print("Please Wait...Loading")
    time.sleep(4)
    print("Utility 3: Disk/Removable Storage Repair(a.k.a Dr Corrupt)")
    print("Utility 4: Python .py status monitor")

    print("*"*30)
    print("*"*30)
    print("q = Quit Utility Program")

    input_ = input(": ")

    if input_ == "q":
        exit()
       
    if input_ == "1":

        time.sleep(2)

        print("*"*30)
        print("Speed Test: Starting")
        print("*"*30)
        
        st = Speedtest()

        Download_ = print("Your connection download speed is:", st.download())
        Upload_ = print("Your connection upload speed is:", st.upload())
        Download1_ = st.download()
        Upload1_ = st.upload()

        print("*"*30)
        print("Speed Test: Finishing Up!")
        print("*"*30)

        answer = input("Would you like results? ")

        if answer == "yes":
            print("NOTE: The first 2 digits frm the left is your internet speed")
            time.sleep(2)
            top = Tk()
            top.geometry("100x100")
            messagebox.showinfo("Speed Test: Download", Download1_)
            top.mainloop()

            reply = input("Would like to leave Utility Build(yes) or go to home page?(no) ")

        else:
            reply1 = print("Would like to leave Utility Build(yes) or go to home page?(no) ")
            if reply1 == "yes":
                main()
            else:
                exit()

    if input_ == "2":
        whatsapp.sendwhatmsg("+61450776320", "Hi, this is a test", 0, 0)

    if input_ == "3":
        
        for filename in listdir('./'):
          if filename.endswith('.png'):
            try:
              img = Image.open('./'+filename) # open the image file
              img.verify() # verify that it is, in fact an image
            except (IOError, SyntaxError) as e:
              print('Bad file:', filename) # print out the names of corrupt files

最佳答案

“模块级别”仅表示脚本的一部分不在类或函数中。您在那里定义的任何名称都直接进入模块命名空间。

因此错误消息只是说要移动

def main():
    
    import os
    import sys
    import time
    import pywhatkit as whatsapp
    from speedtest import Speedtest
    from tkinter import *
    from tkinter import messagebox
    from os import listdir
    from PIL import Image

import os
import sys
import time
import pywhatkit as whatsapp
from speedtest import Speedtest
from tkinter import *
from tkinter import messagebox
from os import listdir
from PIL import Image

def main():

实际上,解释器只关心from tkinter import *这行。其他是约定和可读性的问题。

CPython 对函数内部的局部命名空间进行优化,该函数需要解释器预先知道所有局部变量的名称。星形导入可以防止这种情况发生,因为在运行之前您不知道导入模块中的名称。全局命名空间没有这个限制,所以你可以在那里进行星号导入。

Python 是一种供成年人同意的语言。仅仅因为某些东西是“不好的做法”或不可维护并不会使其成为语法错误。

关于python - 唯一导入 * 只允许在模块级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63597899/

相关文章:

python - 关于 split() 和 foreach 循环的问题

Python:展平 XML 文档(删除换行符)

android - 如何在Android中插入新的SQLite表行?

syntax-error - Ti-84语法错误,与将单个列表转换为矩阵有关

python - 为什么我的 python 没有将当前工作目录添加到路径中?

python - 获取 'str' 到 Django forms.FileField()

python - 如何使用 factory 和 faker 在 Django 中生成唯一数据?

"with"语句的 Python 无效语法

Python 从更高级别的包中导入模块

python - 如何忽略 Python3 中未使用的导入