尽管我的脚本在PyCharm中运行,但在cmd提示符下运行脚本时遇到问题。我有这样的文件夹结构:
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
文件夹中,以方便使用)。它仍然遇到此错误。我浏览了一些有关导入的文章(主要是Importing files from different folder),他们建议您执行以下操作:
import sys
sys.path.insert(0, '/path/to/application/app/folder')
import file
或向每个文件夹添加__init__.py
文件,以使它们注册为软件包。我继续向每个要导入的文件夹和子文件夹中添加了__init__
文件,但是仍然无法从命令提示符下运行...我省略了sys.path.insert()
解决方案,因为我看不到任何好处在已经将其明确添加到我的PATH
变量之后。另一种解决方案是添加“。”在导入之前,因为据推测它只是在搜索python的PATH。我尝试这样做是:
from .UsefulFunctions.Messaging import Texter
ImportError:尝试相对导入,但没有已知的父包
此错误现在也显示在PyCharm上...我不明白为什么我的初始脚本可以在PyCharm上顺利运行的原因,但是从提示符处运行时,同一程序似乎找不到我的导入。有人可以解释运行程序的PyCharm和我的提示之间的区别吗?尽管在Windows上将__init__.py
文件和添加了MyCode
和UsefulFunctions
到我的PATH变量中,这仍然不起作用?
答案 0 :(得分:4)
来自[Python 3.Docs]: Command line and environment - PYTHONPATH:
扩展模块文件的默认搜索路径。格式与外壳程序的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个复选框中的任何一个:
如果您想使 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 ):)。
答案 1 :(得分:3)
检查您的口译员。它与位于Appdata
中的命令提示符解释器不同,而PyCharm的解释器位于Workspace
文件夹中。
答案 2 :(得分:3)
Python使用系统变量PYTHONPATH
来决定要导入的内容。
来自docs:
导入名为垃圾邮件的模块时,解释器首先搜索 具有该名称的内置模块。如果找不到,则进行搜索 在目录给定的目录列表中查找名为spam.py的文件 变量sys.path。 sys.path从以下位置初始化:
- 包含输入脚本的目录(或当前目录) 当未指定文件时)。
- PYTHONPATH(目录名称列表, 语法与Shell变量PATH相同)。
- 与安装有关的默认设置。
运行脚本时PyCharm神奇地导入模块的原因是由于Project Structure -> Content Root
值。默认情况下,它指向您的项目目录。
答案 3 :(得分:0)
在系统变量中设置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
如果路径有空格,请尝试使用引号