Оператор импорта работает на 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=...
Мне потребовалось несколько дней, чтобы разобраться со всем этим.
Я решил свою проблему в два этапа:
- Сначала перейдите в корневой каталог вашего проекта и установите:
export PYTHONPATH=$PATHONPATH:`pwd`
- второй шаг
python3 -m somepackage.foo
запомнить Без суффикса.py
У меня была такая же проблема с использованием модуля scapy.layers.http, эта проблема возникла на моем Kali (linux-Debian), но отлично работает на Win-10 (после нескольких модификаций).
пакет был установлен (scapy-http) правильно, и программа работала в PyCharm, но не как скрипт (из терминала)
Я попытался решить эту проблему с переустановкой в главном корне и возиться с sys.path, но ничего не сработало.
Устранение неполадок и решение
Я обнаружил, что он ищет модуль 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)
Тогда я проверил, где
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/
Вот и все :)!
Я знаю, что это немного глючно, но это сработало!