最新消息:把Logo换了一下,虽然丑了点,但至少完全是自己的设计

PyInstaller生成单一文件后的目录取得

Python 宇托 479浏览 暂无评论

在之前我总是用__file__来取得执行文件的目录,在用PyInstaller生成单一文件之后,发现它的目录不对了。

因为PyInstaller生成单一文件之后,实行时它会把文件解压到一个临时文件夹,然后再执行。所以目录很用python XXXX.py就有些不同了。

在网上找了一段代码,验证了一下自己的判断,然后改成用sys.argv[0]了。

测试代码(TestPath.py)如下:

Python
import os, sys

print('__file__:', __file__)
print('realpath of __file__:', os.path.realpath(__file__))
print('sys.executable:', sys.executable)
print('realpath of sys.executable:', os.path.realpath(sys.executable))
print('sys.argv[0]:', sys.argv[0])
print('realpath of sys.argv[0]:', os.path.realpath(sys.argv[0]))
print('sys.path[0]:', sys.path[0])
print('realpath of sys.path[0]:', os.path.realpath(sys.path[0]))

我把它保存在C:\Test目录下,执行python TestPath.py

DOS
C:\Test>python TestPath.py

结果如下

__file__: TestPath.py
realpath of __file__: C:\Test\TestPath.py
sys.executable: C:\Yutuo\Tools\ProCore\Python\Python3\python.exe
realpath of sys.executable: C:\Yutuo\Tools\ProCore\Python\Python3\python.exe
sys.argv[0]: TestPath.py
realpath of sys.argv[0]: C:\Test\TestPath.py
sys.path[0]: C:\Test
realpath of sys.path[0]: C:\Test

用PyInstaller生成TestPath.exe,然后在C:\Test目录下执行

DOS
C:\Test>TestPath.exe

结果如下

__file__: TestPath.py
realpath of __file__: C:\Test\TestPath.py
sys.executable: C:\Test\TestPath.exe
realpath of sys.executable: C:\Test\TestPath.exe
sys.argv[0]: TestPath.exe
realpath of sys.argv[0]: C:\Test\TestPath.exe
sys.path[0]: C:\Users\Yutuo\AppData\Local\Temp\_MEI43602\base_library.zip
realpath of sys.path[0]: C:\Users\Yutuo\AppData\Local\Temp\_MEI43602\base_library.zip

然后在C:\Users\Yutuo目录下执行C:\Test\TestPath.exe

DOS
C:\Users\Yutuo>C:\Test\TestPath.exe

结果如下

__file__: TestPath.py
realpath of __file__: C:\Users\Yutuo\TestPath.py
sys.executable: C:\Test\TestPath.exe
realpath of sys.executable: C:\Test\TestPath.exe
sys.argv[0]: C:\Test\TestPath.exe
realpath of sys.argv[0]: C:\Test\TestPath.exe
sys.path[0]: C:\Users\Yutuo\AppData\Local\Temp\_MEI79482\base_library.zip
realpath of sys.path[0]: C:\Users\Yutuo\AppData\Local\Temp\_MEI79482\base_library.zip

总结

取得EXE文件目录最好用os.path.realpath(sys.argv[0]);因为PyInstaller能包含数据文件,数据文件会解压到实际执行目录的。取得实际执行目录最好用os.path.realpath(sys.path[0])

转载请注明:宇托的狗窝 » PyInstaller生成单一文件后的目录取得

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址