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

0mkxixxg  于 2022-11-08  发布在  PyCharm
关注(0)|答案(4)|浏览(176)

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

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

在www.example.com中DiscordBot.py我有一个导入

from UsefulFunctions.Messaging import Texter

当我从PyCharm运行它时,它可以正常工作。但是,当我试图从位于DiscordBot级别的命令提示符运行时,它会出现错误:
导入错误:没有名为“UsefulFunctions”的模块
所以我很自然地认为这意味着UsefulFunctions文件夹不在我的路径上。因此,我进入我的环境变量,并将其添加到我的PATH变量(以及MyCode文件夹)。仍然遇到了这个错误。我在这里浏览了一些关于导入的帖子(主要是从不同的文件夹导入文件),他们建议做如下操作:

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

导入错误:尝试相对导入没有已知的父包
这个错误现在也显示在PyCharm上了...我不明白为什么我的初始脚本在PyCharm上可以顺利运行,但是在提示符下运行的程序似乎找不到我的导入。有人能解释一下PyCharm运行的程序和我的提示符之间的区别吗?为什么尽管有__init__.py文件,这个程序还是不起作用在Windows上将MyCodeUsefulFunctions添加到我的PATH变量中?

rsl1atfo

rsl1atfo1#

来自[Python.文档]:命令行和环境- 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个复选框(可以从菜单中触发对话框:运行-〉编辑配置...):

如果您想让 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

相反,在 PyCharm 中(选中上面的 * 内容根 * 相关复选框),可以添加更多内容根,如下图所示(菜单:文件-〉设置...,选择 * 项目结构 *,然后选择 * 添加内容根 *):

当一些必需的模块位于项目树的更深处(并且一些 dir 不是有效的 Python 包名称)时,这很有用。
所以,在处理这类情况时,检查[python.docs]:系统路径,[Python文档]:os.getcwd()和模块路径,可以保存大量的时间和麻烦:

import os
import sys

print(sys.path)
print(os.getcwd())

import some_module
print(some_module)

顺便说一句,我个人不喜欢以 My 开头的名字(例如 MyCode)。这样的名字告诉我,无论实体“穿”它的目的是什么,编写代码的人都不清楚。试着找一个更有用的名字(例如 TestBotProject,或 smth similar):)。
[SO]: PyCharm doesn't recognize installed module (@CristiFati's answer)也可能包含一些有用的信息。

nuypyhwy

nuypyhwy2#

Python使用系统变量PYTHONPATH来决定导入什么。
从文档中:
当导入一个名为spam的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它将spam.py在变量sys.path.sys给出的目录列表中搜索名为www.example.com的文件。path是从以下位置初始化的:

  • 包含输入脚本的目录(未指定文件时为当前目录)。
  • PYTHONPATH(目录名称列表,语法与shell变量PATH相同)。
  • 与安装相关的默认值。

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

qq24tv8q

qq24tv8q3#

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

bvhaajcl

bvhaajcl4#

在系统变量中设置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

如果路径有空格,请尝试使用引号

相关问题