Python中如何在使用pyinstaller打包成二进制后,执行时获取当前程序位置?
打包的时候指定了 --onefile
sys.argv[0] 好像也不行
目前只想到获取自己 PID,然后去系统 path 里面搜出来
有没有更加正常一点的方法?
Python中如何在使用pyinstaller打包成二进制后,执行时获取当前程序位置?
5 回复
os.getcwd()
在PyInstaller打包的程序里,用sys.executable获取的是临时解压目录的路径,不是原始位置。正确的做法是用这个:
import sys
import os
def get_current_path():
if getattr(sys, 'frozen', False):
# 打包后的情况
return os.path.dirname(sys.executable)
else:
# 开发环境的情况
return os.path.dirname(os.path.abspath(__file__))
# 使用示例
current_dir = get_current_path()
print(f"程序所在目录: {current_dir}")
关键点:
sys.frozen是PyInstaller设置的标志,用来判断是否在打包环境中运行- 打包后
sys.executable指向的是可执行文件本身(在Windows是.exe,在Linux/macOS是二进制文件) os.path.dirname()去掉文件名,只保留目录路径- 开发环境下用
__file__获取脚本位置
这样写的好处是开发环境和打包环境都能正确工作。如果你需要程序所在目录的绝对路径,这个方案最可靠。
总结:用sys.frozen判断环境,分别处理。
Windows 下可以用 GetModuleFileName 来获取。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683197
sys.argv[0] 并不可靠,因为可以传任意值进来。

