Оператор импорта работает на PyCharm, но не из терминала

Pycharm 2016.2.3, Mac OS X 10.11.1, Python 3.5 (Homebrew);

У меня есть эта структура папок

project
  /somepackage
    /subpackage
     __init__.py   
     bar.py
   __init__.py
   foo.py

foo.py:
import somepackage.subpackage.bar
print("foo")

bar.py:
print("bar")

Так что мой ожидаемый результат

bar
foo

Это прекрасно работает при запуске из PyCharm. Однако, когда я запускаю его из своего терминала, я получаю ImportError:

$ pwd
$ /home/project (not the actual path; just omitting some personal stuff)
$ python3.5 somepackage/foo.py
File "foo.py", line 1, in <module>
import somepackage.subpackage.bar
ImportError: No module named 'somepackage'

Я нашел этот вопрос, который касается той же проблемы. Однако ни одно из предложенных решений не работает для меня, так как я действительно использую тот же интерпретатор Python, что и PyCharm, и в настоящее время я нахожусь в папке, содержащей somepackage/ папка.

У кого-нибудь есть какие-либо другие предложения о том, как решить эту проблему? Спасибо, любезно!

4 ответа

Решение

Вы запускаете foo.py как скрипт, но вы действительно используете его как модуль. Поэтому правильное решение - запустить его как модуль:

python3 -m somepackage.foo

Для записи, другой альтернативой является редактирование вашего пути, например:

export PYTHONPATH=.

(Или вы можете поместить туда абсолютный каталог, и, конечно, вы должны добавить любые другие каталоги, которые уже есть в вашей PYTHONPATH.) Это ближе к тому, что делает PyCharm, но менее философски правильно.

Как отмечалось выше, установка PYTHONPATH - это то, что заставляет его работать. Я использую следующий контент VSCODE .env, чтобы он работал в любом проекте:

PYTHONPATH=${PROJ_DIR}:${PYTHONPATH}

По сути, это то, что делает PyCharm, когда вы устанавливаете флажок "Добавить корни содержимого в PYTHONPATH" в конфигурации запуска / отладки. Это полезная настройка, но она портит вас, потому что ваш код выходит из строя вне PyCharm.

Или, если вы работаете в терминале, сначала экспортируйте:

export PYTHONPATH=...

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

Я решил свою проблему в два этапа:

  1. Сначала перейдите в корневой каталог вашего проекта и установите:
export PYTHONPATH=$PATHONPATH:`pwd`
  1. второй шаг python3 -m somepackage.fooзапомнить Без суффикса.py

У меня была такая же проблема с использованием модуля scapy.layers.http, эта проблема возникла на моем Kali (linux-Debian), но отлично работает на Win-10 (после нескольких модификаций).

пакет был установлен (scapy-http) правильно, и программа работала в PyCharm, но не как скрипт (из терминала)

Я попытался решить эту проблему с переустановкой в ​​главном корне и возиться с sys.path, но ничего не сработало.

Устранение неполадок и решение

  1. Я обнаружил, что он ищет модуль http в:

    /usr/local/lib/python3.7/dist-packages/scapy/layers/init.py

и получил ImportError:

      from scapy.layers import http --->
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'http' from 'scapy.layers' (/usr/local/lib/python3.7/dist-packages/scapy/layers/__init__.py)

  1. Тогда я проверил, где scapy-http действительно установлен, что называется модулем http.py, поэтому я просто скопировал его в:

             /usr/local/lib/python3.7/dist-packages/scapy/layers/   
    
      found the http.py file in :/usr/local/lib/python3.7/dist-packages/scapy_http/
    

Вот и все :)!

Я знаю, что это немного глючно, но это сработало!

Другие вопросы по тегам