我正在尝试使用Bash和Python编写自己的shell脚本,并且我在与主shell脚本相同的文件夹中有单独的模块。主shell脚本从名为defaultmodules.txt
的文件中读取要导入的模块,然后导入它们。我是这样做的,因为我希望shell的任何用户能够简单地修改这个文件而不是进入代码来改变他们想要导入的模块。目前,该文件包含三个模块的名称。
net
os
subprocess
我使用此代码从文件中读取模块名称并导入它们。
moduleList = []
with open('defaultmodules.txt', 'r') as mods:
for line in mods:
if "#" in line or line == ' ':
pass
else:
moduleList.append(line)
print("Importing module '{}'".format(line))
module = line.rstrip('\n')
print(__import__(module))
__import__(module)
print(module.__init__())
但是,即使在导入之后,在运行os.system('echo test')
后,只需将test
打印到控制台,我就会得到以下回溯:
Traceback (most recent call last):
File "/home/dorian/Desktop/DEBPSH/DEBPSH.py", line 14, in <module>
os.system('echo test')
NameError: name 'os' is not defined
我的代码中可能会导致这种情况发生?
答案 0 :(得分:1)
虽然__import__
会加载模块并将其放入sys.modules
:
import sys
__import__('os')
'os' in sys.modules # True
没有引用它,所以请保持一个:
globals()[module] = __import__(module)
然后您可以使用os.system
等...
正如kindall简明扼要地陈述:
也就是说,
__import__
是一个函数并返回模块。如果你没有给它起个名字,它就没有名字。所以给它起个名字。
答案 1 :(得分:1)
你必须像这样导入因为__import__
是函数所以,它必须存储在返回值中。
os = __import__('os')
基本上
pkg = __import__('pkg')
pkg = __import__('pkg.mod')
答案 2 :(得分:0)
importlib.import_module(name, package=None)
是__import__
的良好替代品。或者您可以使用exec 'import %s' % module
。