当前位置:  开发笔记 > 编程语言 > 正文

确定pyInstaller生成的Python EXE中的应用程序路径

如何解决《确定pyInstaller生成的PythonEXE中的应用程序路径》经验,为你挑选了3个好方法。

我有一个驻留在单个.py文件中的应用程序.我已经能够让pyInstaller成功地将它捆绑到一个EXE for Windows中.问题是,应用程序需要一个始终位于同一目录中的应用程序旁边的.cfg文件.

通常,我使用以下代码构建路径:

import os
config_name = 'myapp.cfg'
config_path = os.path.join(sys.path[0], config_name)

但是,当从pyInstaller生成的EXE调用sys.path时,它似乎是空白的.当您运行python交互式命令行并尝试获取sys.path [0]时,会发生同样的行为.

有没有更具体的方法来获取当前运行的应用程序的路径,以便我可以找到相对于它的文件?



1> Soviut..:

我找到了解决方案.您需要检查应用程序是作为脚本还是作为冻结的exe运行:

import os
import sys

config_name = 'myapp.cfg'

# determine if application is a script file or frozen exe
if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
elif __file__:
    application_path = os.path.dirname(__file__)

config_path = os.path.join(application_path, config_name)


仅供参考:有关较新的PyInstaller版本(3.0+),请参见@normanius答案。

2> normanius..:

根据pyInstaller 的文档,建议的恢复应用程序路径的方法如下:

#!/usr/bin/python3
import sys, os
if getattr(sys, 'frozen', False):
    # If the application is run as a bundle, the pyInstaller bootloader
    # extends the sys module by a flag frozen=True and sets the app 
    # path into variable _MEIPASS'.
    application_path = sys._MEIPASS
else:
    application_path = os.path.dirname(os.path.abspath(__file__))

经过pyInstaller v3.2测试,但这肯定也适用于早期版本.

Soviut的解决方案不起作用,至少对于最新版本的pyInstaller来说并不常见(注意OP已有很多年了).例如,在MacOS上,将应用程序捆绑到单文件包时,sys.executable只指向嵌入式存档的位置,这不是 pyInstaller引导加载程序创建临时应用程序环境后应用程序实际运行的位置.只有sys._MEIPASS正确指向该位置.有关pyInstaller如何工作的更多信息,请参阅此doc-page.


使用`sys._MEIPASS`不适用于单文件可执行文件.从文档:`对于单文件夹包,这是该文件夹的路径,无论用户在哪里放置它.对于单文件包,这是bootloader创建的_MEIxxxxxx临时文件夹的路径.将`sys.executable`用于单文件可执行文件.

3> Polv..:

我稍微缩短了代码.

import os, sys

if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
    os.chdir(application_path)

logging.debug('CWD: ' + os.getcwd())

但是,sys._MEIPASS指向错误的目录.我认为它还需要sys._MEIPASS+\app_name

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有