2015-04-20 3 views
0

У меня возникли проблемы с импортом собственных пакетов в мои программы, поэтому я создал тестовую папку, чтобы попытаться понять, что я делаю неправильно.Невозможно импортировать собственные пакеты в Python 2.7

Это простейшая вещь, но я все еще не могу заставить ее работать.

Это моя структура папок:

test 
> pack1 
    > __init__.py 
    > mod1.py 
> pack2 
    > __init__.py 
    > mod2.py 

Оба init -файлы пусты.

mod1 выглядит следующим образом:

def foo(): 
    print "hello" 

и mod2 выглядит следующим образом

from pack1.mod1 import * 

foo() 

При выполнении кода в PyCharm, все работает отлично! Но при попытке выполнить из cmd я получаю ImportError: No module named pack1.mod1

Is sys.path.insert(0, "../pack1") Мой единственный вариант, или есть еще одна причина, по которой cmd не будет сотрудничать?

+1

Как именно вы выполнить свой код в командной строке? – Alik

+0

@Alik '(Documents)/test/pack2> python mod2.py' – ProjectDude

+0

« Is sys.path.insert (0, «../pack1») мой единственный вариант «Нет, вы также можете использовать' sys.path .apend ("/ path/to/pack1 /)". И сначала '' import sys'', но это должно быть очевидно. – cezar

ответ

0

В обычном Python есть только определенные папки, которые отмечены для импорта пакетов, и папка test, которую вы используете, похоже, не является одним из этих файлов. Чтобы изменить это, отредактируйте sys.path в mod2.py и затем импорт pack1.mod1.

mod2.py

import sys 
# Add test folder to sys.path 
sys.path.append("../") 

from pack1.mod1 import * 
# Prints "hello"! 
foo()

Кроме того, вместо редактирования sys.path, можно добавить папку pack1 в папку Lib в каталоге Python. Это будет работать, потому что это по умолчанию одна из папок в sys.path.

Python 2.7 
    > Lib 
    > pack1 
     > __init__.py 
     > mod1.py

mod2.py

from pack1.mod1 import * 
# Prints "hello"! 
foo()
2

Независимо от версии питона должен знать, где искать пакеты. Манипулирование sys.path - это быстрый и грязный вариант, который иногда прерывается в будущем, если ваш код становится более сложным. Попробуйте сделать пакет и установить его с помощью pip install -e или python setup.py develop

(Посмотрите на это в хорошем distutils introduction)

+1

«Манипулирование sys.path - это быстрый и грязный вариант» для этого, но во время разработка может быть полезна для тестирования. – cezar

+0

, когда вы начинаете добавлять код только для того, чтобы разместить это, наступит день, когда именно этот дополнительный код вас укусит ... был там, сделал это – knitti

+0

Не проще ли добавить pack1 в папку Lib, или это также может укусить кого-то назад? –

0

Вы говорите, что выполнить его с помощью: (Documents)/test/pack2> python mod2.py

Проблема заключается в том, что pack2.mod2.py не знает, где pack1 является.

Выполнить его как модуль: (Documents)/test> python -m pack2.mod2

+0

Не знал о 'python -m', это удобно! Но мне нужно, чтобы это работало через импорт; Это всего лишь тест, чтобы показать мою проблему, но мне нужно, чтобы «import» корректно работал для более крупного проекта. – ProjectDude

+0

Для большего проекта я бы создал пакет и установил его через pip – RvdK

0

Если вы не хотите изменять сценарии или расположение каталогов, вы можете использовать PYTHONPATH переменную окружения.

Пример

[email protected]:/tmp/test/pack2$ python mod2.py 
Traceback (most recent call last): 
    File "mod2.py", line 1, in <module> 
    from pack1.mod1 import * 
ImportError: No module named pack1.mod1 
[email protected]:/tmp/test/pack2$ export PYTHONPATH="${PYTHONPATH}:/tmp/test" 
[email protected]:/tmp/test/pack2$ python mod2.py 
hello 
[email protected]:/tmp/test/pack2$ 

Подробнее о поиске модулей - https://docs.python.org/2/tutorial/modules.html#the-module-search-path