首页 > 解决方案 > 导入如何在 Spyder IDE 中工作?为什么从 Powershell 运行代码会有所不同?

问题描述

我已经看到了很多关于这个主题的问题,但似乎没有一个可以解释为什么会发生这种情况或提供我可以使用的解决方案。

以下脚本根据运行的位置提供 8 种不同的输出,我真的不明白为什么。我已经设法确定了一种模式,但仍然不明白为什么会发生这种情况,也没有帮助我解决问题。

我有一个文件叫

__init__.py

在与此文件相同的目录中,我有一个名为“source_code”的文件夹。在那个文件夹中,我有另一个文件名为

__init__.py

source_code/__init__.py

文件包含一行代码,即:

print("source_code imported")

首先

__init__.py

文件具有以下脚本:

import sys

print(sys.executable)
print(sys.path[0])

try:
    from . import source_code
except ImportError as ie:
    print(ie)
    
try:
    import source_code
except ImportError as ie:
    print(ie)

我使用 Spyder 4.1.5 作为 Anaconda 软件包的一部分,以及 Windows 10 上的 Powershell。我有一个使用 conda 创建的虚拟环境,只安装了 Jupyter notebook 和 spider。

我发现的模式(据我所知)如下:

  1. 如果我通过powershell从虚拟环境之外运行脚本,输出如下:
C:\Users\user\Desktop\Anaconda\python.exe
C:\Users\user\path\to\file
cannot import name 'source_code' from '__main__' (.\path\to\file\__init__.py)
source_code imported
  1. 如果我从虚拟环境内部运行 Powershell,则输出为:
C:\Users\user\Desktop\Anaconda\envs\venv\python.exe
C:\Users\user\path\to\file
attempted relative import with no known parent package
source_code imported
  1. 如果我在虚拟环境之外打开 spyder,然后通过单击编辑器并按“Control+Enter”来运行脚本,输出为:
C:\Users\user\Desktop\Anaconda\python.exe
C:\Users\user\Desktop\Anaconda\python37.zip
cannot import name 'source_code' from '__main__' (C:\Users\user\path\to\file\__init__.py)
No module named 'source_code'
  1. 如果(仍然在 spyder 中,在虚拟环境之外)我单击顶部栏中的运行按钮,输出为:
C:\Users\user\Desktop\Anaconda\python.exe
C:\Users\user\Desktop\Anaconda\python37.zip
cannot import name 'source_code' from '__main__' (C:\Users\user\path\to\file\__init__.py)
source_code imported
  1. 如果我然后单击返回编辑器并再次按“Control+Enter”,现在的输出是:
C:\Users\user\Desktop\Anaconda\python.exe
C:\Users\user\Desktop\Anaconda\python37.zip
  1. 如果我从虚拟环境中运行 spyder。点击进入编辑器并按下“Control+Enter”,输出为:
C:\Users\user\Desktop\Anaconda\envs\venv\python.exe
C:\Users\user\Desktop\Anaconda\envs\venv\python38.zip
attempted relative import with no known parent package
No module named 'source_code'
  1. 然后点击顶部的运行按钮,输出为:
C:\Users\user\Desktop\Anaconda\envs\venv\python.exe
C:\Users\user\Desktop\Anaconda\envs\venv\python38.zip
attempted relative import with no known parent package
source_code imported
  1. 然后单击返回编辑器并再次按“Control+Enter”给出:
C:\Users\user\Desktop\Anaconda\envs\venv\python.exe
C:\Users\user\Desktop\Anaconda\envs\venv\python38.zip
attempted relative import with no known parent package

我尝试在“source_code/ init .py”文件中包含“a=8”并使用“from .source_code import a”而不是“from .import source_code”。

我也尝试过包括以下几行:

from pathlib import Path as path

sys.path.insert(0, path(__file__).parent)

这改变了 print(sys.path[0]) 的输出,但对 import 语句的输出没有影响。

我想了解以下内容:

1:为什么

Cannot import name "source_code" from "__main__." 

改成

"attempted relative import with no known parent package." 

当我从外部移动到虚拟环境内部时?

2:为什么从Powershell运行脚本,将文件的位置添加到sys.path的开头,而从spyder运行却没有?(参见第 2 行输出 1 和 2 与输出 3 之后的区别。)

3:在Spyder中,点击进入编辑器和按下“Control + Enter”并点击运行按钮有什么区别。

4:为什么spyder按“Control + Enter”时找不到“source_code”模块(与脚本位于同一目录中),但单击运行按钮运行后却可以?(请参阅输出 3 与输出 5 以及输出 6 与输出 8 之间的区别)。

5a:为什么(一旦我通过单击运行按钮运行脚本)按“Control + Enter”会停止生成 ImportError 但也不会运行脚本(即它不会在输出 5 和 8 中打印“source_code Imported” )。

5b:为什么这种行为会根据我是在虚拟环境内部还是外部而改变。即为什么输出 4 和 5 的第 3 行不同,但输出 7 和 8 相同?

6:如何让我的脚本始终如一地成功导入“source_code”模块,无论我从哪里运行它?

标签: python-3.ximportpython-importspyder

解决方案


推荐阅读