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
这不是我想要的。
我有一个 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
这不是我想要的。