为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕莱坞森 2021-11-23 20:01:10
尽管它在 PyCharm 中工作,但我在 cmd 提示符下运行我的脚本时遇到问题。我有一个这样的文件夹结构:MyCode # PyCharm project folder  /UsefulFunctions    /Messaging      /Texter.py  /DiscordBot    /DiscordBot.py在 DiscordBot.py 我有一个导入from UsefulFunctions.Messaging import Texter当我从 PyCharm 运行它时,这可以正常工作。但是,当我尝试从位于该DiscordBot级别的命令提示符运行时,它会出错:导入错误:没有名为“UsefulFunctions”的模块所以很自然地我认为这意味着该UsefulFunctions文件夹不在我的路径上。因此,我进入了我的环境变量并将其添加到我的PATH变量(以及MyCode文件夹中)。还是遇到了这个错误。我在这里浏览了一些关于导入的帖子(主要是从不同文件夹导入文件),他们建议执行以下操作:import syssys.path.insert(0, '/path/to/application/app/folder')import file或者将__init__.py文件添加到每个文件夹,以便将它们注册为包。我继续将__init__文件添加到我试图从中导入的每个文件夹和子文件夹中,但仍然无法从命令提示符运行......我省略了sys.path.insert()解决方案,因为在已经明确地将它添加到我的PATH变量后,我看不到任何好处。另一种解决方案是添加“。” 在导入之前,因为据说它只是在搜索 python 的 PATH。我尝试这样做:from .UsefulFunctions.Messaging import Texter导入错误:尝试在没有已知父包的情况下进行相对导入这个错误现在也显示在 PyCharm 上......我不明白为什么我的初始脚本可以在 PyCharm 上顺利运行,但是当从提示运行时,同一个程序似乎无法找到我的导入。有人可以解释一下运行程序的 PyCharm 和我的提示之间的区别吗?为什么这不,尽管有工作__init__.py的文件,并有加MyCode,并UsefulFunctions在Windows上我的PATH变量?
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

来自[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 个复选框:

//img1.sycdn.imooc.com//619cd82e0001faf619211076.jpg

如果你想从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

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


查看完整回答
反对 回复 2021-11-23
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-11-23
?
长风秋雁

TA贡献1757条经验 获得超7个赞

Python 使用系统变量PYTHONPATH等来决定要导入的内容。
文档

当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果未找到,它将在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。sys.path 从这些位置初始化:

  • 包含输入脚本的目录(或未指定文件时的当前目录)。

  • PYTHONPATH(目录名称列表,与 shell 变量 PATH 具有相同的语法)。

  • 依赖于安装的默认值。

PyCharm 在您运行脚本时神奇地导入模块的原因是因为Project Structure -> Content Root值。默认情况下,它指向您的项目目录。


查看完整回答
反对 回复 2021-11-23
  • 3 回答
  • 0 关注
  • 284 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信