【问题标题】:Exec doesn't work with functions and variablesExec 不适用于函数和变量
【发布时间】:2019-07-18 19:18:06
【问题描述】:

我正在制作一个适用于 .py 文件的插件系统。当我使用该插件(.py 文件)执行 exec() 并且它具有函数或变量时,它会给出 NameError。

NameError:名称“editor_nf”未定义

我已经用谷歌搜索过了,但没有找到任何对我有帮助的东西。

我只做了:

plugin = open("plugin.py","r").read()
exec(plugin)

plugin.py 文件是:

import tkinter as tk

def editor_nf():
    enf = tk.Tk()
    enf.title("New file")
    enf.config(bg="white")
    enf.geometry("500x500")

    enf.mainloop()

def editor():
    editor = tk.Tk()
    editor.title("Website Editor")
    editor.config(bg="white")
    editor.geometry("1400x700")

    editor_nf_btn = tk.Button(editor,text="New file",bg="gray",fg="black",font="Arial",command=editor_nf)
    editor_nf_btn.grid(row=0,column=0)

    editor.mainloop()

editor()

所以我希望它与函数一起使用,以便人们可以创建 WORKING 函数。

我不希望它显示:

NameError:名称“editor_nf”未定义

dcg 回答了,它有帮助,但后来我将它转换为 exe,我得到了这个

【问题讨论】:

  • import plugin有问题吗?另外,请注意,您可以动态执行诸如 __import__(<module_path>) 之类的导入。
  • @dcg 不,因为我希望每个人都创建插件并上传它们,这意味着如果我这样做,我需要每次都更新它,如果将来有 10 万人制作插件,那不会不行。
  • 它给出了一个 NameError 显示完整的错误信息。
  • @JohnGordon 已编辑
  • @crowdzer 我明白了,您可以使用函数__import__(<module_path>) 从给定位置导入所有插件。

标签: python exec


【解决方案1】:

让我举一个简单的例子来说明我在 cmets 中告诉你的内容。这是我的文件夹结构:

/sample
   - plugins/
       - __init__.py # not necessary, but maybe you want to apply some logic 
                     # before importing the plugins
       - plugin1.py
       - plugin2.py
       - plugin3.py
   - __init__.py
   - test.py

每个插件都会打印它是什么插件(例如,print('plugin 1'))。 test.py如下:

import os

if __name__ == '__main__':
    # load plugins
    plugins = [p for p in os.listdir('plugins') if not p.startswith('_')]
    for p in plugins:
        __import__('plugins.'+p[:-3])

输出是:

plugin 1
plugin 2
plugin 3

这意味着我使用__import__ 成功导入了所有这些模块(插件)。请注意,__import__ 返回对导入模块的引用,因此您可以存储它以供以后操作。希望对您有所帮助!

【讨论】:

  • 现在看看我的问题,我编辑了它,因为我不知道为什么会出现这个错误,我的文件夹还在,所以请帮忙
【解决方案2】:

我说我用错误和其他东西编辑了它,但我自己修复了它。感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2023-04-09
    • 2015-04-21
    • 2013-12-06
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多