pyinstaller打包 获取执行路径

1. 获取文件执行路径py脚本2. 分别在不同的文件下执行,查看结果3. 总结

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

又要打包程序了, 然后就是遇到问题了, 最后解决问题.

在这里就是为了说下使用pyinstaller打包exe后, 获取文件路径异常的问题.

首先需要知道:

  • 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的路径:
```txt
T.exe: D:\work\python_code\dist\T.exe
```
- 执行pyinstaller -D T.py 生成可执行文件夹, T.exe的路径:
```txt
T.exe: D:\work\python_code\dist\T\T.exe
```
- T.py绝对路径如下:
```txt
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的执行路径

  • 可以在代码中指定工作目录, 然后根据工作目录, 获取某些配置文件

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值