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

时间:2019-03-02 06:36:43

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

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

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

4 个答案:

答案 0 :(得分:4)

来自[Python 3.Docs]: Command line and environment - PYTHONPATH

  

扩展模块文件的默认搜索路径。格式与外壳程序的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

如果您想使 cmdline 正常工作,那么您也必须在其中做同样的事情:

[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 ):)。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

  

导入名为垃圾邮件的模块时,解释器首先搜索   具有该名称的内置模块。如果找不到,则进行搜索   在目录给定的目录列表中查找名为spam.py的文件   变量sys.path。 sys.path从以下位置初始化:

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

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

答案 3 :(得分: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

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