Невозможно импортировать мои собственные модули в 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

Ответ 1

В вашем конкретном случае похоже, что вы пытаетесь импортировать SomeObject из сценариев myapp.py и TestCase.py. Из myapp.py сделайте

import SomeObject

так как он находится в одной папке. Для TestCase.py выполните

from ..myapp import SomeObject

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

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

хотя это обычно не рекомендуется.

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

Ответ 2

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

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

Ответ 3

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

/Library/Python/2.7/site-packages

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

/opt/awesome/custom_python_modules

Ответ 4

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

from myapp.myapp import SomeObject

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

Ответ 5

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

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

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

Ответ 6

pip install в Windows 10 по умолчанию устанавливается в "Program Files/PythonXX/Lib/site-packages", который является каталогом, требующим административных привилегий. Поэтому я исправил проблему, запустив pip install от имени администратора (вы должны открыть командную строку от имени администратора, даже если вы вошли в систему с учетной записью администратора). Также безопаснее вызывать pip из python.
например
python -m pip install <package-name>
вместо
pip install <package-name>

Ответ 7

В моем случае это был сюрприз Windows против Python, несмотря на то, что имена файлов в Windows не чувствительны к регистру, импорт из Python. Так что если у вас есть файл Stuff.py вам нужно импортировать это имя как есть.

Ответ 8

Попробуйте запустить программу основного файла, в которой создана функция.