为什么 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 python
、py
而不是 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
时),但是,这是任何人的猜测。
我正在使用 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 python
、py
而不是 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
时),但是,这是任何人的猜测。