PyCharm与系统命令提示符(Windows)的导入方式不同

Ree*_*ner 10 python directory import pycharm python-3.x

尽管我的脚本在PyCharm中运行,但在cmd提示符下运行脚本时遇到问题。我有这样的文件夹结构:

MyCode # PyCharm project folder
  /UsefulFunctions
    /Messaging
      /Texter.py
  /DiscordBot
    /DiscordBot.py
Run Code Online (Sandbox Code Playgroud)

在DiscordBot.py中,我有一个导入

from UsefulFunctions.Messaging import Texter
Run Code Online (Sandbox Code Playgroud)

当我从PyCharm运行它而没有问题时,此方法有效。但是,当我尝试从位于该DiscordBot级别的命令提示符运行时,出现以下错误:

ImportError:没有名为“ UsefulFunctions”的模块

因此,我自然而然地认为这意味着该UsefulFunctions文件夹不在我的路径上。因此,我进入了环境变量并将其添加到PATH变量(以及MyCode用于良好测量的文件夹)中。它仍然遇到此错误。我在这里浏览了一些有关导入的文章(主要是从其他文件夹导入文件),他们建议您执行以下操作:

import sys
sys.path.insert(0, '/path/to/application/app/folder')
import file
Run Code Online (Sandbox Code Playgroud)

或将__init__.py文件添加到每个文件夹中,以使它们注册为软件包。我继续将__init__文件添加到尝试从中导入的每个文件夹和子文件夹中,但是仍然无法从命令提示符下运行...我省略了sys.path.insert()解决方案,因为在将其明确添加到PATH变量后,我看不到任何好处。另一种解决方案是添加“。” 在导入之前,因为据推测它只是在搜索python的PATH。我尝试这样做是:

from .UsefulFunctions.Messaging import Texter
Run Code Online (Sandbox Code Playgroud)

ImportError:尝试相对导入,没有已知的父包

这个错误现在也显示在PyCharm上...我不明白为什么我的初始脚本可以在PyCharm上顺利运行的原因,但是从提示符处运行时,同一程序似乎找不到我的导入。有人可以解释运行程序的PyCharm和我的提示之间的区别吗?为什么这不,尽管有工作__init__.py的文件,并有加MyCode,并UsefulFunctions在Windows上我的PATH变量?

Cri*_*ati 5

来自[Python 3.Docs]:命令行和环境 - PYTHONPATH

增加模块文件的默认搜索路径。格式与shell 的PATH 相同:一个或多个由os.pathsep分隔的目录路径名(例如Unix 上的冒号或Windows 上的分号)。不存在的目录将被静默忽略。

您还可以在[SO]: Strange error while using Pycharm to debug PyQt gui (@CristiFati's answer)上找到更多详细信息。

因此,为了让Python能够在不指定路径的情况下加载模块(包),路径必须存在于%PYTHONPATH%环境变量中。

您在问题中多次提到%PATH%,但它是%PYTHONPATH%(必须将MyCode添加到其中)。

PyCharm这样做是因为下图中的(任何)2 个复选框:

图像0

如果你想从cmdline开始工作,你也必须在那里做同样的事情:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054955891\DiscordBot]> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> set py
Environment variable py not defined

[prompt]> "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'

[prompt]> set PYTHONPATH=e:\Work\Dev\StackOverflow\q054955891

[prompt]> set py
PYTHONPATH=e:\Work\Dev\StackOverflow\q054955891

[prompt]> "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
Run Code Online (Sandbox Code Playgroud)

作为旁注,我个人讨厌以My开头的名称(例如MyCode)。请试着寻找更为有用的名称(例如TestBotProject,或不便类似):)。


小智 3

检查您的口译员。它与位于 的命令提示符解释器不同Appdata,而 PyCharm 的解释器位于该Workspace文件夹中。