2015-04-03 3 views
0

Я пытаюсь написать свой собственный сценарий оболочки с помощью Bash и Python, и у меня есть отдельные модули внутри той же папки, что и основной скрипт оболочки. Сценарий основной оболочки читает, какие модули импортируются из файла с именем defaultmodules.txt, а затем импортирует их. Я сделал это таким образом, потому что я хочу, чтобы любой пользователь оболочки мог просто изменить этот файл вместо того, чтобы входить в код, чтобы изменить, какие модули они хотят импортировать. В настоящее время файл содержит имена трех модулей.NameError при попытке использовать импортированный модуль

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 

Что в моем коде может быть причиной, чтобы это произошло?

ответ

1

Хотя __import__ будет загружать модуль и поместить его в sys.modules:

import sys 

__import__('os') 
'os' in sys.modules # True 

Там нет ссылки связан с ним, так что держите одну вокруг:

globals()[module] = __import__(module) 

Вы можете использовать os.system и т.д .. .

Как kindall кратко в комментариях:

То есть __import__ является функцией и возвращает модуль. Если вы не дадите ему имя, у него не будет имени. Так что дайте ему имя.

+1

То есть '__import__' является функцией и * возвращает * модуль. Если вы не дадите ему имя, у него не будет имени. Так что дайте ему имя. – kindall

+0

Могу ли я сохранить его в словаре вместо использования 'globals() [module]'? –

+1

@Dorian yup - 'd = {}' ... then 'd [module] = module', затем доступ через' d ['os']. System() ', но это еще более неясно, чем выше ... Будьте проще просто попросите пользователя отредактировать свои импортные товары: -D –

1

Вам необходимо импортировать как это, потому что __import__ является функцией, поэтому она должна быть сохранена.

os = __import__('os') 

В основном

pkg = __import__('pkg') 
pkg = __import__('pkg.mod') 
0

importlib.import_module(name, package=None) является хорошей заменой для __import__. Или вы можете использовать exec 'import %s' % module.

Смежные вопросы