Ответ 1
Код не импортируется традиционным способом; вместо код запуска используется exec
statement для загрузки __init__.py
.
Отказывание потока в функции запуска load_module()
для пакета (так что это не путь к модулю):
# the fullname module isn't yet loaded
sys.modules[fullname] = imp.new_module(fullname)
initfile = '__init__' # or u'__init__' if a unicode path was used
# if no .py file was found, so not a module
mod = sys.modules[fullname]
mod.__loader__ = self
mod.__file__ = os.path.join(os.getcwd(),filename)
mod.__path__ = [filename]
#init file
initfile = os.path.join(filename,initfile+ext)
if os.path.exists(initfile):
with open(initfile,'U') as fp:
code = fp.read()
exec code in mod.__dict__
return mod
Это создает пустой объект модуля, загружает исходный код вручную и выполняет его как строку, передавая в пространстве имен модулей как глобальные переменные для исполняемого кода. Результирующий объект кода всегда будет перечислять <string>
в tracebacks:
>>> import imp
>>> mod = imp.new_module('foo.bar')
>>> mod.__file__ = r'C:\some\location\foo\bar'
>>> mod.__path__ = [r'foo\bar']
>>> exec 'raise ValueError("oops")' in mod.__dict__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
ValueError: oops
Поскольку нет имени файла, связанного с кодом, PyCharm не может найти исходный источник.
Обходной способ заключается в использовании функции compile()
для создания объекта кода сначала и присоединения имени файла к этому:
>>> exec compile('raise ValueError("oops")', r'C:\some\location\foo\bar\__init__.py', 'exec') in mod.__dict__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\some\location\foo\bar\__init__.py", line 1, in <module>
ValueError: oops
Обратите внимание, что я включил __init__.py
в имя файла; переведя его обратно в пусковую установку, которую вы использовали:
if os.path.exists(initfile):
with open(initfile,'U') as fp:
code = fp.read()
exec compile(code, initfile, 'exec') in mod.__dict__