0 条
LOGO
Yutuo

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

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

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

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

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

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目录下执行

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

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文件目录最好用python#os.path.realpath(sys.argv[0]);因为PyInstaller能包含数据文件,数据文件会解压到实际执行目录的。取得实际执行目录最好用python#os.path.realpath(sys.path[0])

发表我的评论

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

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