0
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
4

3 回答 3

2

您的代码中有两个问题:

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

你真正想要的是:

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

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

另请参阅:为什么 Python 的 __import__ 需要 fromlist?

于 2012-04-17T11:01:48.057 回答
1

你没有定义test_samp你正在定义modules['test_samp']。另外,如果它在您需要导入的脚本中scripts.test_samp

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

于 2012-04-17T10:51:46.293 回答
1

您可以使用以下命令运行它:

modules["test_samp"].function("test")
于 2012-04-17T10:53:10.750 回答