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

问题描述 投票:10回答:4

我在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上将MyCodeUsefulFunctions添加到我的PATH变量,为什么这不起作用?

python python-3.x import pycharm directory
4个回答
4
投票

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

Img0

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


3
投票

Python使用系统变量PYTHONPATH来决定要导入的内容。 来自docs

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

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

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


3
投票

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.