为什么从 python 调用 *.py 文件时 Python 导入会成功,但仅通过文件名调用时却不会

Why would a Python import succeed when invoking *.py file from python but not when invoked by file name alone

我正处于整合一些 Python 以在 Matlab 中调用一些计算并将所有数字汇总到 html 代中的早期阶段,我将在 ll.xist.我最初安装了 Python 2.7.5 32 位,但是安装了 64 位 Matlab R2015a 我无法 install the matlab engine for that version of python. I then downloaded a 64bit version of Python 2.7.9 and tried to do a pip into ll-xist, which was apparently not well maintained and failed. I then downloaded Python 3.4.3 64bit, downloaded the ll.xist installer ll-xist-5.13.win-amd64-py3.4.exe,我认为我可以继续了。我不得不做一个 pip 来拉入 cssutils,它成功了。

现在我要从控制台调用我的 python 文件。 如果我在 python 之前调用它,一切正常,如果我不这样做,则无法识别导入 。什么可以解释这种差异?看起来我安装的各个版本之间存在一些安装问题,路径上的 python 版本没有被正确调用,我猜正在调用 python 的 2.7.9 版本不知何故,因为那个安装从未安装过 ll.xist,尽管我的 2.7.5 安装了。

C:\Temp>python MyScript.py a.txt b.txt
  file1: a.txt
  file2: b.txt

C:\Temp>MyScript.py a.txt b.txt
Traceback (most recent call last):
  File "C:\Temp\MyScript.py", line 20, in <module>
    from ll.xist    import xsc
ImportError: No module named ll.xist

这也是一个健全性检查...

C:\Temp>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

C:\Temp>which python
/cygdrive/c/Python34/python

检查 .py 的文件关联。虽然正确的安装可能在您的路径中,但文件关联可能仍指向不同的版本。

您可以通过在测试脚本中导入 sys 模块并调用 print(sys.version) 来检查这一点。然后 运行 带有 python test.pytest.py 的测试脚本,以查看打印了哪些版本。

原来这里的管理问题是所谓的 Python Launcher for Windows

3.4. Python Launcher for Windows New in version 3.3.

The Python launcher for Windows is a utility which aids in the location and execution of different Python versions. It allows scripts (or the command-line) to indicate a preference for a specific Python version, and will locate and execute that version.

在我的控制台中,我可以通过 py 命令看到 "default" 版本...

C:\Users\me>py
Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

C:\Users\me>py -3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

这是基本修复...

The key benefit of this is that a single launcher can support multiple Python versions at the same time depending on the contents of the first line.

在我的案例中,我必须添加到我的脚本中的第一行是

#! python3

有关 Launcher 背后的详细信息和动机的精彩评论链接 here