Как PyCharm импортирует иначе, чем системная командная строка (Windows) - PullRequest
0 голосов
/ 02 марта 2019

У меня проблема с запуском моего скрипта в командной строке, несмотря на то, что он работает в PyCharm.У меня есть структура папок как таковая:

MyCode # PyCharm project folder
  /UsefulFunctions
    /Messaging
      /Texter.py
  /DiscordBot
    /DiscordBot.py

В DiscordBot.py У меня есть импорт

from UsefulFunctions.Messaging import Texter

Это работает, когда я запускаю его из PyCharm без проблем.Однако, когда я пытаюсь запустить из командной строки, расположенной на уровне DiscordBot, он выдает следующее сообщение:

ImportError: Нет модуля с именем 'UsefulFunctions'

Естественно, ядумал, что это означает, что папка UsefulFunctions не на моем пути.Поэтому я вошел в свои переменные окружения и добавил его в свою переменную PATH (а также в папку MyCode, если хотите).Тем не менее он столкнулся с этой ошибкой.Я просмотрел здесь несколько сообщений об импорте (в основном Импорт файлов из другой папки ), и они рекомендуют сделать что-то вроде:

import sys
sys.path.insert(0, '/path/to/application/app/folder')
import file

Или добавить __init__.py файлы в каждую папку, чтобызаставить их зарегистрироваться как пакеты.Я пошел дальше и добавил __init__ файлы в каждую папку и подпапку, из которой пытался импортировать, но все еще не смог запустить из командной строки ... Я пропустил решение sys.path.insert(), потому что не вижу никакой выгоды от этого после уже явнодобавив его в мою PATH переменную.Другое решение было добавить "."перед импортом, потому что предположительно в противном случае он только ищет PATH в python.Я попытался сделать это следующим образом:

from .UsefulFunctions.Messaging import Texter

ImportError: попытка относительного импорта без известного родительского пакета

И эта ошибка теперь также отображается в PyCharm ...Непонятно, почему мой первоначальный скрипт без сбоев работает на PyCharm, но эта же программа не может найти мой импорт при запуске из приглашения.Кто-нибудь может объяснить, пожалуйста, разницу между PyCharm, запускающим программу, и моей подсказкой?Почему это не будет работать, несмотря на то, что __init__.py файлы и добавили MyCode и UsefulFunctions к моей переменной PATH в Windows?

Ответы [ 4 ]

0 голосов
/ 11 марта 2019

Установите ваш путь Python в системных переменных, чтобы вы могли запустить python -help из любого места в каталоге, а затем перейти к папке проекта

c:\nnnn..\mmm..\MyCode 
run python  c:\nnnn..\mmm..\MyCode\DiscordBot
    \DiscordBot.py

или

C:\Python27\python.exe "C:\Users\Username\MyCode\DiscordBot
    \DiscordBot.py" or 
C:\Python27\python.exe C:\Users\Username\MyCode\DiscordBot
    \DiscordBot.py

Попробуйте цитатыесли путь имеет пробел

0 голосов
/ 06 марта 2019

Python использует системную переменную PYTHONPATH, в частности, для решения, что импортировать.
Из документов :

Когда модуль с именем spamпосле импорта интерпретатор сначала ищет встроенный модуль с таким именем.Если он не найден, он ищет файл с именем spam.py в списке каталогов, заданных переменной sys.path.sys.path инициализируется из следующих мест:

  • Каталог, содержащий сценарий ввода (или текущий каталог, если файл не указан).
  • PYTHONPATH (список имен каталогов, с тем же синтаксисом, что и у переменной оболочки PATH).
  • Зависит от установки по умолчанию.

Причина, по которой PyCharm магически импортирует модуль при запуске сценария, заключается в значении Project Structure -> Content Root.По умолчанию он указывает на каталог вашего проекта.

0 голосов
/ 10 марта 2019

С [Python 3.Docs]: командная строка и окружение - PYTHONPATH :

Дополнить путь поиска по умолчанию для файлов модулей.Формат такой же, как у PATH оболочки: одно или несколько путей к каталогам, разделенных os.pathsep (например, двоеточия в Unix или точки с запятой в Windows).Несуществующие каталоги молча игнорируются.

Более подробную информацию можно также найти в [SO]: странная ошибка при использовании Pycharm для отладки графического интерфейса PyQt (ответ @ CristiFati) .

Итак, чтобы Python мог загружать модуль (пакет) без указания его пути, путь должен присутствовать в переменной среды % PYTHONPATH% .

Вы упомянули % PATH% несколько раз в вопросе, но это % PYTHONPATH% ( MyCode необходимо добавитьк этому).

PyCharm делает это из-за (любого из) двух флажков на изображении ниже:

Img0

Если вы хотите, чтобы все работало с cmdline , вам также нужно сделать то же самое:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054955891\DiscordBot]> set py
Environment variable py not defined

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054955891\DiscordBot]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" DiscordBot.py
Traceback (most recent call last):
  File "DiscordBot.py", line 1, in <module>
    from UsefulFunctions.Messaging import Texter
ModuleNotFoundError: No module named 'UsefulFunctions'

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054955891\DiscordBot]> set PYTHONPATH=e:\Work\Dev\StackOverflow\q054955891

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054955891\DiscordBot]> set py
PYTHONPATH=e:\Work\Dev\StackOverflow\q054955891

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054955891\DiscordBot]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" DiscordBot.py
e:\Work\Dev\StackOverflow\q054955891\UsefulFunctions\Messaging\Texter.py imported

В качестве примечанияЯ лично ненавижу имена, начинающиеся с My (например, MyCode ).Попробуйте найти более полезное имя (например, TestBotProject или smth аналогичный):).

0 голосов
/ 02 марта 2019

Проверьте вашего переводчика.Он отличается от интерпретатора командной строки, расположенного в Appdata, тогда как интерпретатор PyCharm находится в папке Workspace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...