【问题标题】:How PyCharm imports differently than system command prompt (Windows)PyCharm 如何导入不同于系统命令提示符 (Windows)
【发布时间】:2019-07-24 03:37:32
【问题描述】:

我在 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 和我的提示之间的区别吗?为什么尽管有__init__.py 文件已将MyCodeUsefulFunctions 添加到Windows 上的PATH 变量中,这不起作用?

【问题讨论】:

  • 当您尝试import UsefulFunctions.Messaging.Texter as Texter 时会发生什么?
  • @LukeNing 同样是ImportError 不幸的是:(

标签: python python-3.x import pycharm directory


【解决方案1】:

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

【讨论】:

  • 如何检查我的解释器并让它们匹配,以便命令提示符可以运行脚本?
  • 转到文件>设置>解释器设置 如果它使用项目的 python 文件作为解释器,如 'C:\Users\Riyouk\PycharmProjects\untitled1\venv\Scripts\python.exe' .将其更改为安装在您的 appdata 文件夹中的 python,其地址更可能是 'C:\Users\Riyouk\AppData\Local\Programs\Python\Python36\python.exe'
【解决方案2】:

Python 使用系统变量PYTHONPATH 来决定导入什么。
来自docs

当一个名为 spam 的模块被导入时,解释器首先搜索 对于具有该名称的内置模块。如果没有找到,然后搜索 对于一个名为 spam.py 的文件,该文件位于 变量 sys.path。 sys.path 从这些位置初始化:

  • 包含输入脚本的目录(或当前目录 当没有指定文件时)。
  • PYTHONPATH(目录名称列表, 使用与 shell 变量 PATH 相同的语法)。
  • 依赖于安装的默认值。

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

【讨论】:

  • 我不确定如何检查我的PYTHONPATH,但我在命令提示符下运行了set path=%PATH%;%PYTHONPATH%;,然后由于相同的ImportError,我的程序仍然没有运行。我怎么可能通过命令提示符实现与 PyCharm 神奇的“内容根”值相同的行为(我无法在 PyCharm 设置菜单的“项目结构”选项卡下看到)?
  • 问题是PYTHONPATH 是空的(检查echo %PYTHONPATH%)。您需要将其设置为项目目录的完整路径 MyCode 以启用从任何​​地方(在本例中为 DiscordBot)从该项目导入。如果您希望此设置保持不变,则必须使用setx 将其设置为系统环境变量。这需要您以管理员身份运行 cmd。
【解决方案3】:

来自[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 个复选框(任何一个):

如果你想从 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)。尝试找到一个更有用的名称(例如 TestBotProjectsmth 类似的名称):)。

【讨论】:

  • 太糟糕了,我在 13 小时前没有看到赏金 ^^ 这正是我首先要回答的:Run/Debug configuration 具有特殊的默认行为。此外,如果 OP 的每个模块都有些独立,那么定义所有必要的 __init__.py 看起来也像 pythonic 的事情吗?
  • @LoneWanderer:赏金不应该是发布答案的原因:)。如果你觉得你有一些可以增加价值的东西,请继续发布它。如果不想遵守规则,应该在每个目录中添加 __init__.py 。但正如您所见,没有它们也能正常工作。
  • @Reedinationer:这回答了你的问题吗?如果是,请接受答案,以便其他人也能够承认([SO]: What should I do when someone answers my question?)。如果没有,请告诉我如何改进它,所以它会回答它。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 2015-05-24
    • 2017-10-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多