Я озадаченный энтузиаст Python. Я разместил Что еще я могу сделать, чтобы устранить неполадки, связанные с пакетом, который не импортируется в python, но импортируется в ipython, находясь в virtualenv? думая, что у меня возникла проблема с моим virtualenv. Дальнейшее устранение неполадок показало, что это, вероятно, не так.
Я был бы признателен за любую информацию или советы по устранению неполадок, чтобы я мог продолжить разработку пакета. Заранее спасибо!
Краткий обзор моей проблемы в системе Ubuntu 14.04.1 LTS с Python 2.7.6 .:
- У меня есть скрипт с именем test_dummy.py, который добавляет пути к пакетам в sys.path, а затем пытается импортировать пакеты.
- Пакеты импортируются без ошибок, когда скрипт запускается с
run test_dummy.pyвнутри ipython. - Исключения ImportError выдаются для определенных пакетов, когда скрипт запускается с
python test_dummy.py. - Что больше всего расстраивает, так это то, что пакеты, которые содержат код, т.е. больше, чем просто импорт
__init__.pyфайла без исключения. Простые тестовые пакеты, содержащие только файл__init__.py, не импортируются должным образом. Я не могу определить, что заставляет простейшие пакеты генерировать исключения при импорте, когда скрипт вызывается из python, то естьpython test_dummy.py.
Мой pwd такой:
.
├── browser
├── display
├── hello_world
├── singleton
├── test_a
└── tests
test_a как таковой:
test_a
├── __init__.py
└── __init__.pyc
hello_world как таковой:
hello_world/
├── hello.py
├── hello.pyc
├── __init__.py
└── __init__.pyc
hello.py как таковой:
HELLO = 'Hello, world!'
print HELLO
Все остальные пакеты ['browser', 'display', 'singleton'] содержат файлы init.py и другой код, который при запуске не создает никаких известных исключений.
тесты такие:
tests
└── test_dummy.py
Код в test_dummy.py:
import importlib
import os
import sys
HOME = os.path.expanduser('~')
PYTHON = os.path.join(HOME, 'development/my_python')
PACKAGES = [
'browser',
'display',
'singleton',
'test_a',
'hello_world',
]
MODULES = [
'',
'',
'',
'',
'hello',
]
IMPORTS = ['.'.join((pkg, module)).strip('.')
for pkg, module
in zip(PACKAGES, MODULES)]
"""
append sys.path with PACKAGES if package exists and not already
in the sys.path
"""
for package in PACKAGES:
package = os.path.join(PYTHON, package)
if os.path.exists(package) is True:
if package not in sys.path:
print "loading package '{0}'".format(package)
sys.path.append(package)
else:
print "package '{0}' already in sys.path".format(package)
else:
message = "Package '{0}' does not exist.".format(package)
raise IOError(message)
"""
import IMPORTS if the package is in sys.path
"""
for item in IMPORTS:
pkg_in_path = [pkg == os.path.basename(path)
for pkg in PACKAGES for path in sys.path]
if any(pkg_in_path):
print "loading '{0}'".format(item)
importlib.import_module(item)
else:
raise AttributeError("{0} not in sys.path".format(item))
Результаты ipython:
$ ipython
# result
Python 2.7.6 (default, Mar 22 2014, 22:57:26)
Type "copyright", "credits" or "license" for more information.
IPython 2.2.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
Warning: disable autoreload in ipython_config.py to improve performance.
In [3]: run tests/test_dummy.py
loading package '/home/dmmmd/development/my_python/browser'
loading package '/home/dmmmd/development/my_python/display'
loading package '/home/dmmmd/development/my_python/singleton'
loading package '/home/dmmmd/development/my_python/test_a'
loading package '/home/dmmmd/development/my_python/hello_world'
loading 'browser'
loading 'display'
loading 'singleton'
loading 'test_a'
loading 'hello_world.hello'
Hello, world!
результаты от python tests/test_dummy.py:
loading package '/home/dmmmd/development/my_python/browser'
loading package '/home/dmmmd/development/my_python/display'
loading package '/home/dmmmd/development/my_python/singleton'
loading package '/home/dmmmd/development/my_python/test_a'
loading package '/home/dmmmd/development/my_python/hello_world'
loading 'browser'
loading 'display'
loading 'singleton'
loading 'test_a'
Traceback (most recent call last):
File "tests/test_dummy.py", line 46, in <module>
importlib.import_module(item)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named test_a
Импорт пакета «test_a» в интерпретатор Python не вызывает исключения:
Python 2.7.6 (default, Mar 22 2014, 22:57:26)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('/home/dmmmd/development/my_python/test_a')
>>> import test_a
>>> print test_a
<module 'test_a' from 'test_a/__init__.pyc'>
>>>
__init__.pyвtest_a? А вbrowser? - person t.pimentel   schedule 01.09.2014from browser import Firefox. В test_a файл init.py пуст. - person dmmfll   schedule 01.09.2014test_aили изменить имя папкиbrowserнаtest_aи посмотреть, импортируется ли он? - person t.pimentel   schedule 01.09.2014test_aиbrowser. Исключения по-прежнему выбрасывались. - person dmmfll   schedule 01.09.2014