唯一导入*仅允许在模块级别

Dev*_*ani 3 python syntax-error python-import

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

import * only allowed at module level
Run Code Online (Sandbox Code Playgroud)

这是我的代码

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
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 8

“模块级别”仅意味着脚本中不属于类或函数的部分。您在那里定义的任何名称都会直接进入模块名称空间。

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

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
Run Code Online (Sandbox Code Playgroud)

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():
Run Code Online (Sandbox Code Playgroud)

事实上,口译员真正关心的只是台词from tkinter import *。其他的是约定和可读性的问题。

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

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

  • @DevangSahani。那是因为你从未调用过你编写的函数。`def` 语句创建一个函数对象,仅此而已。将 `main()` 添加到脚本的底部,可以选择在导入保护中添加 `if __name__ == '__main__':` ,以便该函数仅在您将模块作为脚本执行时运行,而不是在导入时运行它变成另一个。 (2认同)