为什么 Python 启动器在解释器中工作时不能导入脚本(使用 shebang)?

Why can't the Python launcher import in a script (with shebang), when it works in the interpreter?

我正在使用 py Python 启动器,导入时发生了一些奇怪的事情。某些模块无法在脚本中导入——尽管使用 pip 安装并可在解释器中导入。不过,更重要的是:它在没有 shebang 行的脚本中工作。

例如,此脚本有效:

import requests

但是这个没有:

#!/usr/bin/env python
import requests

这是为什么?这里的 shebang 有什么不同?

py 启动器实际上 handles shebang lines even on Windows. This means the Python version a script is run in may differ depending on the shebang line. For example, a shebang line of #!/usr/bin/env python2 will always run Python 2, and #!/usr/bin/env python3 will always run Python 3. Without a shebang line, py pretends the shebang is !python, which it handles using its built-in rules for selecting a Python version(请参阅 Python 版本限定符 部分)。默认情况下,如果你安装了它,这将是 Python 2.

的某个版本

不过,这是让您感到困惑的地方。如果 shebang 具体是 !/usr/bin/env pythonpy 而不是 follows the PATH environment variable to mimic the behavior of Linux's env(请参阅最后一段),并且只有在那之后才会回到正常行为。这意味着带有 shebang 的脚本可能 在与 py 通常调用不同的 Python 版本下 运行,具体取决于您的 PATH 中的内容。这就是这里发生的事情 - #!/usr/bin/env python 在路径上找到另一个 Python 版本,并使用它来代替。该版本可能没有您 pip install 安装的模块,因此可能会失败。

由于您使用的是 py,您的 PATH 中不应该有 python,因此 从您的 PATH 中删除任何 Python 基本目录条目(例如 C:\Python35),或者确保 PATH 中的第一个 Python 是 py 使用的默认值,一切都应该正常工作。

为什么 py 默认不尝试遵循路径(或者当 shebang 是 !python 时),但是,这是任何人的猜测。