尝试使用已导入的模块时出现NameError

时间:2015-04-03 04:58:28

标签: python

我正在尝试使用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

我的代码中可能会导致这种情况发生?

3 个答案:

答案 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

相关问题