Python 如果 运行 作为来自 Windows 不同位置的 .exe 的脚本位置

Python location of script if run as .exe from different place on Windows

我有一个 python 脚本:

C:\ProgramFiles\myscript.py

并使用 pyinstaller 创建了它的 .exe 版本:

C:\ProgramFiles\myscript.exe

我确保 C:\ProgramFiles 在我的环境 windows 路径中,这样我就可以 运行 从任何位置的命令提示符脚本。

现在,问题是,我想让脚本知道它的位置。我尝试了一些可用的解决方案,例如:

sys.argv[0]

os.path.abspath(__file__)

但这些解决方案似乎只有在您使用 .py 脚本和 python 路径时才有效。一旦我切换到 .exe 并使用 windows 环境路径,它就不再起作用了。因此,当我 运行 来自某个奇怪地方的程序时,例如:

C:\Users\John>myscript

它总是假定我 运行 命令所在的位置就是它所在的位置,none 的解决方案将给我我想要的结果 - 这将是原始位置:

C:\ProgramFiles\

基本上是我想要实现的目标 - 我 运行 一个命令提示符和 运行 其中的一个 .exe 程序(最初是一个 .py 脚本)。然后 windows 搜索它的路径变量,看它是否能在可见的地方找到程序。如果 windows 确实找到了它,那么它将被执行。我希望程序知道 windows 实际在哪里找到它,而不是当前的工作目录。

您需要执行以下操作才能知道运行脚本的文件夹:

import sys, os
if getattr(sys, 'frozen', False):
    # we are running in a bundle
    bundle_dir = sys._MEIPASS
else:
    # we are running in a normal Python environment
    bundle_dir = os.path.dirname(os.path.abspath(__file__))

print(bundle_dir)

bundle_dir 是执行脚本的文件夹。这样,当作为 python 脚本或转换为 exe 后,您的代码将自动运行。

正如我在评论中提到的,请查看 PyInstaller 文档中的 Run-time Information 部分。

经过一些测试(感谢 buran 的 his/her 指导),我最终使用了这个解决方案:

import sys
import os

if getattr(sys, 'frozen', False):
    script_location = sys.executable
else:
    script_location = os.path.abspath(__file__)
script_location = os.path.dirname(script_location) 

目前似乎同时适用于 pyinstaller 构建的程序的 .py 版本和 .exe 版本。

sys._MEIPASS

给我位置在

Appdata\Local\Temp 

这不是我想要的。