Import не работает при запуске python как script, но не в iPython?

У меня есть проект, структурированный как таковой:

folder1
       |
       folder2
             |
             tests

У меня есть __init__.py в каждой папке. Когда я в родительском каталоге folder1, я запускаю iPython и делаю

from folder1.folder2.tests.test1 import main
main()

все работает нормально. Однако, когда я запускаю

python folder1/folder2/tests/test1.py

Я получаю ImportError: нет модуля с именем folder1.folder2.file1, где мой оператор import в test1

from folder1.folder2.file1 import class1

Смутно об этом - я предполагаю, что это проблема с пути, но я не понимаю, что не так с моим кодом (многие аналогичные настройки в других папках) и почему он все еще работает в iPython, а не на python, запущенном как script.

Ответ 1

путь поиска модуля (python 3 document) отличается от файла script и без него:

интерактивный интерпретатор python

(идет как для python, так и ipython)

$ python
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
>>>

Обратите внимание, что первая запись представляет собой пустую строку. Пустая строка - это относительный путь, эквивалентный .. Относительные пути в пути поиска модуля относятся к текущему рабочему директору процесса интерпретатора, так что это всего лишь текущий рабочий каталог, в который вы вызывали интерпретатор. (Что в вашем случае оказалось корнем вашего проекта.)

выполнение файла script

$ echo 'import sys' > /tmp/pathtest.py
$ echo 'print(sys.path)' >> /tmp/pathtest.py 
$ python /tmp/pathtest.py 
['/tmp', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']

Обратите внимание, что здесь первая запись - это абсолютный путь каталога, содержащего файл script, который мы передали в качестве аргумента.

Ответ 2

У меня возникла аналогичная проблема при импорте numpy или любой библиотеки в зависимости от numpy. Проблема заключалась в том, что у меня было имя файла random.py в папке проекта.

У Numpy есть random.py в нем для своих случайных функций, но при импорте он принимает random.py моей папки проекта.

Лучшее решение - не называть файл со стандартными именами модулей любой библиотеки.

Наслаждайтесь..:)