2012-02-21 2 views
69

Мне сложно понять, как работает импорт модулей в Python (до этого я никогда не делал этого на любом другом языке).Невозможно импортировать мои собственные модули в Python

Скажем, у меня есть:

myapp/__init__.py 
myapp/myapp/myapp.py 
myapp/myapp/SomeObject.py 
myapp/tests/TestCase.py 

Теперь я пытаюсь получить что-то вроде этого:

myapp.py 
=================== 
from myapp import SomeObject 
# stuff ... 

TestCase.py 
=================== 
from myapp import SomeObject 
# some tests on SomeObject 

Однако, я определенно делает что-то неправильно, как Python не может видеть, что myapp представляет собой модуль:

ImportError: No module named myapp 

ответ

53

В вашем конкретном случае, это выглядит, как вы пытаетесь импортировать SomeObject из myapp.py и Скрипты TestCase.py. From myapp.py, do

import SomeObject 

потому что он в той же папке. Для TestCase.py, сделайте

from ..myapp import SomeObject 

Однако, это будет работать только если вы импортируете TestCase из пакета. Если вы хотите напрямую запустить python TestCase.py, вам придется путаться с вашим путем. Это можно сделать в Python:

import sys 
sys.path.append("..") 
from myapp import SomeObject 

Хотя это, как правило, не рекомендуется.

В общем, если вы хотите, чтобы другие люди использовали ваш пакет Python, вы должны использовать distutils для создания сценария установки. Таким образом, любой может легко установить ваш пакет, используя команду python setup.py install, и она будет доступна везде на их машине. Если вы серьезно относитесь к пакету, вы можете даже добавить его в индекс пакета Python, PyPI.

+0

Я пробовал просто использовать 'import' в моей' TestCase.py', но он все равно дал мне та же ошибка. Я предполагаю, что это потому, что он находится в подкаталоге '__init __. Py'? – n0pe

+0

Ой, думаю, я понял. Если мои тестовые примеры вызывают из пакета, я смогу использовать 'from ... import ...' правильно? – n0pe

+1

Вы будете только в том случае, если TestCase импортируется извне пакета, например, если я запускаю 'из myapp.tests import TestCase из скрипта вне myapp. Если вы используете 'python TestCase.py' в папке с тестами, вы не можете делать относительный импорт –

20

функция import ищет фил в ваш PYTHONPATH env. переменной и вашей локальной директории. Таким образом, вы можете поместить все файлы в том же каталоге, или экспортировать путь набрав в терминале ::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/" 
+0

Тогда как я могу убедиться, что он работает для всех, кто будет его использовать? Я бы предпочел не указывать им, чтобы установить определенные переменные среды перед запуском. – n0pe

+0

текущий каталог находится в pythonpath, поэтому, если скрипты находятся в той же папке/каталоге, он должен работать. К сожалению, каждый из этих сценариев находится в отдельных каталогах. – JKirchartz

+2

Для пользователей Windows вместо 'export' мы установили PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \" –

8

экспорт путь хороший способ. Другим способом является добавление .pth в местоположение вашего сайта. На мой макинтош мой питон держит сайт-пакеты в/Library/Python показано ниже

/Library/Python/2.7/site-packages 

Я создал файл с именем awesome.pth в /Library/Python/2.7/site-packages/awesome.pth и в файл поместите следующий путь, который ссылается на мои удивительные модули

/opt/awesome/custom_python_modules 
+1

в том случае, если я работаю в windows, как это сделать –

+0

Я не уверен. В случае, если вы используете окна. Найдите некоторое программное обеспечение vm и используйте linux. Или - см. Этот ответ об экспорте переменных в Windows. http://stackoverflow.com/questions/559816/how-to-export-and-import-environment-variables-in-windows – jmontross

+0

это именно то, что мне нужно – Lee88

2

Вы можете попробовать

from myapp.myapp import SomeObject 

потому, что ваше имя проекта совпадает с myapp.py, что делает его поиск проекта д ocument first

0

В вашем первом каталоге myapp вы можете добавить файл setup.py и добавить два кода на Python в настройках.py

from setuptools import setup 
setup(name='myapp') 

в вашем первом каталоге myapp в командной строке, используйте pip install -e. для установки пакета

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