我在cmd提示符下运行我的脚本时遇到问题,尽管它在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
文件夹以获得良好的衡量标准)。它仍遇到此错误。我在这里浏览了一些有关进口的帖子(主要是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和我的提示之间的区别吗?尽管有__init__.py
文件并且在Windows上将MyCode
和UsefulFunctions
添加到我的PATH变量,为什么这不起作用?
来自[Python 3.Docs]: Command line and environment - 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个复选框:
如果你想从cmd行开始工作,你也必须在那里做同样的事情:
[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):)。
Python使用系统变量PYTHONPATH
来决定要导入的内容。
来自docs:
导入名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果未找到,则会在变量sys.path给出的目录列表中搜索名为spam.py的文件。 sys.path从这些位置初始化:
- 包含输入脚本的目录(或未指定文件时的当前目录)。
- PYTHONPATH(目录名列表,语法与shell变量PATH相同)。
- 依赖于安装的默认值。
PyCharm在运行脚本时神奇地导入模块的原因是因为Project Structure -> Content Root
值。默认情况下,它指向您的项目目录。
检查你的口译员。它与命令提示符Interpreter不同,位于Appdata
,而PyCharm的解释器位于Workspace
文件夹中。
在系统变量中设置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
如果路径有空格,请尝试引号