pyinstaller打包时,怎么获取执行路径

1. 获取文件执行路径py脚本

首先需要知道:

  • sys.argv[0]: 运行时, python后面的参数

  • sys.path[0]: 只要模块的绝对路径目录

  • Path(__file__): 显示文件在执行是的所在目录
    查看脚本文件T.py

    import sys
    import os
    from pathlib import Path
    
    
    def main():
        print("sys.argv[0]: ".ljust(35), sys.argv[0])
        print("os.path.realpath(sys.argv[0]): ".ljust(35), os.path.realpath(sys.argv[0]))
        print("sys.path[0]: ".ljust(35),sys.path[0])
        print("os.path.realpath(sys.path[0]): ".ljust(35), os.path.realpath(sys.path[0]))
        print("Path(sys.executable): ".ljust(35), Path(sys.executable))
        print("os.getcwd(): ".ljust(35), os.getcwd())
        print("Path(__file__): ".ljust(35), Path(__file__))
    
    if __name__ == "__main__":
        main()
    
    • 执行pyinstaller -F T.py 生成一个可执行文件, T.exe的路径:
    T.exe: D:\work\python_code\dist\T.exe
    
    • 执行pyinstaller -D T.py 生成可执行文件夹, T.exe的路径:
    T.exe: D:\work\python_code\dist\T\T.exe
    
    • T.py绝对路径如下:
    T.py:  D:\work\python_code\T.py
    

2. 分别在不同的文件下执行,查看结果

  • 执行<pyinstaller -D T.py>生成的exe文件

    # 直接执行T.exe
        PS D:\work\python_code\dist\T> .\T.exe
        sys.argv[0]:                        D:\work\python_code\dist\T\T.exe
        os.path.realpath(sys.argv[0]):      D:\work\python_code\dist\T\T.exe
        sys.path[0]:                        D:\work\python_code\dist\T\base_library.zip
        os.path.realpath(sys.path[0]):      D:\work\python_code\dist\T\base_library.zip
        Path(sys.executable):               D:\work\python_code\dist\T\T.exe
        os.getcwd():                        D:\work\python_code\dist\T
        Path(__file__):                     D:\work\python_code\dist\T\T.py
    
    # 在T.exe的上上级目录下执行.\dist\T\T.exe
        PS D:\work\python_code> .\dist\T\T.exe
        sys.argv[0]:                        D:\work\python_code\dist\T\T.exe
        os.path.realpath(sys.argv[0]):      D:\work\python_code\dist\T\T.exe
        sys.path[0]:                        D:\work\python_code\dist\T\base_library.zip
        os.path.realpath(sys.path[0]):      D:\work\python_code\dist\T\base_library.zip
        Path(sys.executable):               D:\work\python_code\dist\T\T.exe
        os.getcwd():                        D:\work\python_code
        Path(__file__):                     D:\work\python_code\dist\T\T.py 
    
    # 将T文件复制到其他文件下执行T.exe
        C:\Users\xxx\Desktop\win\T>T.exe
        sys.argv[0]:                        T.exe
        os.path.realpath(sys.argv[0]):      C:\Users\xxx\Desktop\win\T\T.exe
        sys.path[0]:                        C:\Users\xxx\Desktop\win\T\base_library.zip
        os.path.realpath(sys.path[0]):      C:\Users\xxx\Desktop\win\T\base_library.zip
        Path(sys.executable):               C:\Users\xxx\Desktop\win\T\T.exe
        os.getcwd():                        C:\Users\xxx\Desktop\win\T
        Path(__file__):                     C:\Users\xxx\Desktop\win\T\T.py
    
    

    在上面结果中可以看出:
    1). os.path.realpath(sys.argv[0]): 是T.exe执行目录的绝对路径 均相同
    2). os.path.realpath(sys.path[0]): 是T.exe执行时, python库压缩文件目录 均相同
    3). Path(sys.executable): 是T.exe执行目录的绝对路径 均相同
    4). os.getcwd(): 是T.exe的工作目录 不相同
    5). Path(__file__): 是T.exe执行时,生成的执行文件T.py所在的目录 均相同

  • 执行<pyinstaller -F T.py>生成的exe文件

    # 直接执行T.exe
        D:\rdc_work\python_code\dist>T.exe
        sys.argv[0]:                        T.exe
        os.path.realpath(sys.argv[0]):      D:\rdc_work\python_code\dist\T.exe
        sys.path[0]:                        C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip
        os.path.realpath(sys.path[0]):      C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip
        Path(sys.executable):               D:\rdc_work\python_code\dist\T.exe
        os.getcwd():                        D:\rdc_work\python_code\dist
        Path(__file__):                     C:\Users\xxx\AppData\Local\Temp\_MEI172642\T.py
    
    # 在T.exe的上上级目录下执行.\dist\T\T.exe
        C:\Users\xxx\Desktop\win>T.exe
        sys.argv[0]:                        T.exe
        os.path.realpath(sys.argv[0]):      C:\Users\xxx\Desktop\win\T.exe
        sys.path[0]:                        C:\Users\xxx\AppData\Local\Temp\_MEI229962\base_library.zip
        os.path.realpath(sys.path[0]):      C:\Users\xxx\AppData\Local\Temp\_MEI229962\base_library.zip
        Path(sys.executable):               C:\Users\xxx\Desktop\win\T.exe
        os.getcwd():                        C:\Users\xxx\Desktop\win
        Path(__file__):                     C:\Users\xxx\AppData\Local\Temp\_MEI229962\T.py
    
    # 将T.exe文件复制到其他文件下执行T.exe
        C:\Users\xxx\Desktop>win\T.exe
        sys.argv[0]:                        win\T.exe
        os.path.realpath(sys.argv[0]):      C:\Users\xxx\Desktop\win\T.exe
        sys.path[0]:                        C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip
        os.path.realpath(sys.path[0]):      C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip
        Path(sys.executable):               C:\Users\xxx\Desktop\win\T.exe
        os.getcwd():                        C:\Users\xxx\Desktop
        Path(__file__):                     C:\Users\xxx\AppData\Local\Temp\_MEI172642\T.py
    
    

    在上面结果中可以看出:
    1). os.path.realpath(sys.argv[0]): 是T.exe执行目录的绝对路径, 均相同
    2). os.path.realpath(sys.path[0]): 是T.exe执行时, 生成的一个python库压缩文件目录 均相同
    3). Path(sys.executable): 是T.exe执行目录的绝对路径 均相同
    4). os.getcwd(): 是T.exe的工作目录 不相同
    5). Path(__file__): 是T.exe执行时,生成的执行文件T.py所在的目录 均相同

  • 执行T.py

    # 在T.py的所在目录下执行
        PS D:\work\python_code> python .\T.py
        sys.argv[0]:                        .\T.py
        os.path.realpath(sys.argv[0]):      D:\work\python_code\T.py
        sys.path[0]:                        D:\work\python_code
        os.path.realpath(sys.path[0]):      D:\work\python_code
        Path(sys.executable):               C:\Users\xxx\.virtualenvs\python_code-y2WbWbrA\Scripts\python.exe
        os.getcwd():                        D:\work\python_code
        Path(__file__):                     T.py
    
    # 在其他文件夹下执行T.py
        PS D:\work\python_code\dist\T> python -u "d:\work\python_code\T.py"
        sys.argv[0]:                        d:\work\python_code\T.py
        os.path.realpath(sys.argv[0]):      D:\work\python_code\T.py
        sys.path[0]:                        d:\work\python_code
        os.path.realpath(sys.path[0]):      D:\work\python_code
        Path(sys.executable):               C:\Users\xxx\.virtualenvs\python_code-y2WbWbrA\Scripts\python.exe
        os.getcwd():                        D:\work\python_code\dist\T
        Path(__file__):                     d:\work\python_code\T.py
    

    在上面结果中可以看出:
    1). os.path.realpath(sys.argv[0]): 是T.py执行目录的绝对路径, 均相同
    2). os.path.realpath(sys.path[0]): 是T.py执行时, 所在上一级文件的绝对路径 均相同
    3). Path(sys.executable): 是T.py执行时, pyhton程序的绝对路径 均相同
    4). os.getcwd(): 是T.py的工作目录 不相同
    5). Path(__file__): 是T.py执行时, T.py所在的目录 均相同

3. 总结

1). os.path.realpath(sys.argv[0]): 是T.py/T.exe执行目录的绝对路径
2). os.path.realpath(sys.path[0]): 是T.py执行时, 所在上一级文件的绝对路径
3). Path(sys.executable): 执行T.py时, pyhton.exe的绝对路径, 执行T.exe时, T.exe的绝对路径
4). os.getcwd(): 是T.py/T.exe的工作目录
5). Path(__file__): 是[T.py]/[T.exe生成T.py]执行时, T.py所在的目录
在py文件在打包前后,同样的获取文件路径的方式,获取的结果, 可能不同, 就会造成读取某些配置文件异常
因此,

  • 可以使用os.path.realpath(sys.argv[0]), 可以在打包前后获取py/exe文件的绝对路径
  • 打包时, 可以使用Path(sys.executable),获取exe的执行路径
  • 可以在代码中指定工作目录, 然后根据工作目录, 获取某些配置文件
  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值