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}")

关键点:

  1. sys.frozen是PyInstaller设置的标志,用来判断是否在打包环境中运行
  2. 打包后sys.executable指向的是可执行文件本身(在Windows是.exe,在Linux/macOS是二进制文件)
  3. os.path.dirname()去掉文件名,只保留目录路径
  4. 开发环境下用__file__获取脚本位置

这样写的好处是开发环境和打包环境都能正确工作。如果你需要程序所在目录的绝对路径,这个方案最可靠。

总结:用sys.frozen判断环境,分别处理。

sys.argv[0] 并不可靠,因为可以传任意值进来。

回到顶部