【问题标题】:python __import__ all files in folder not workingpython __import__文件夹中的所有文件都不起作用
【发布时间】:2012-04-28 16:54:11
【问题描述】:
from os import listdir
modo= [name.split(".py")[0] for name in listdir("scripts") if name.endswith(".py")]
modules = {}
for modu in modo:
    modules[modu] = __import__(modu)
test_samp.function("test") 

你好! 如果说脚本目录中存在“test_samp.py”,为什么 这不允许我运行 test_samp.function("test")? 它返回:

Unhandled exception in thread started by <function function at 0x8e39204>
Traceback (most recent call last):
  File "test_this.py", line 6, in function
    test_samp.function("test")  
NameError: global name 'test_samp' is not defined

【问题讨论】:

  • 你有__init__.py 文件吗?
  • 是的,但不管有没有,都没有区别。 ://

标签: python import module directory


【解决方案1】:

您的代码中有两个问题:

  • __import__ 不导入全局命名空间,它返回一个模块
  • 您正在尝试导入 test_samp 而它是 scripts.test_samp

你真正想要的是:

scripts = __import__("scripts", fromlist=modo)
scripts.test_samp.function("test") 

__import__ 以上返回 scripts 包,并加载了所有子模块。不要忘记通过在其中创建 __init__.py 来使 scripts 目录成为一个包。

另请参阅:Why does Python's __import__ require fromlist?

【讨论】:

  • 感谢您的帮助!这似乎使它起作用了,但是 init.py 引起了我的兴趣。不过,正如上面帖子中的评论所引用的那样,我遇到了问题。
【解决方案2】:

您不是在定义test_samp,而是在定义modules['test_samp']。另外,如果它在脚本中,则需要导入 scripts.test_samp

在你的情况下使用一个包。添加一个空(或不)__init__.py(带有 2 个下划线)。并使用import scripts。使用scripts.test_samp.function("test") 访问您的功能。您可以使用reload(scripts) 重新加载所有包。

【讨论】:

  • 除非脚本在你的 python 路径中。
  • 谢谢,但是为什么会这样:for modu in modo: __import__(modu) 也不行?
  • @Lattyware 是的。但更好的方法是使用带有 init.py 文件的包
  • 你是什么意思不起作用?您发布的错误与该声明无关
  • 我将如何执行此操作?重要的是我能够使用 reload(all_modules_in_folder) 函数。 init.py 需要包含什么才能使其工作?
【解决方案3】:

你可以用这个来运行它:

modules["test_samp"].function("test")

【讨论】:

    猜你喜欢
    • 2014-05-24
    • 2011-07-22
    • 1970-01-01
    • 2019-08-29
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多