pyinstaller似乎没有找到数据文件

Joë*_*oël 7 python pyinstaller

编辑3:当我需要知道我的脚本/可执行文件的位置时,我替换__file__sys.argv[0].这不完全一样,但在我的情况下它似乎运行良好(至少在可执行版本...).现在一切都工作正常,在单文件模式下,使用接受的答案功能来访问资源文件!


编辑2:如接受的答案的评论所示,问题来自我的脚本中的路径解析; 我尝试使用__file__获取脚本的位置,以便我可以访问其资源文件.打包后这不起作用,因为它__file__会将文件名从Python.dll脚本返回到脚本,所以总是没有路径而只是文件名.所以我必须找到另一种技巧来访问资源文件; 目前解决方法是将当前目录移动到可执行路径.

顺便说一句,这意味着ConfigParser应该在访问文件时报告问题,而不是缺少某个部分.

我将以解决此路径解析问题的方式更新此问题.


我遇到了问题pyinstaller,因为这是我第一次使用它,我确信我做错了.

所以,这就是问题:pyisntaller在我编写的脚本上顺利运行,并在dist文件夹中生成一些东西.好的,所以现在我想执行它以查看是否一切顺利,这就是我得到的:

C:\Program Files\PyInstaller\pyinstaller-1.5.1>p_tool\dist\p_tool\p_tool.exe -?
Traceback (most recent call last):
  File "<string>", line 104, in <module>
  File "p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/logging.config", line 76, in f
ileConfig
  File "p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/logging.config", line 112, in
_create_formatters
  File "p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/ConfigParser", line 532, in ge
t
ConfigParser.NoSectionError: No section: 'formatters'
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是logging.conf文件丢失了,所以我在文件中添加了它(以及其他一些资源文件)p_tool.spec,但这并不是更好.

Python版本:2.6.6,在WinXP下.我正在使用,pyinstaller因为我需要它来封装Solaris工作站的文件.

那么,有人确实有这个问题吗?唯一相关的主题是以下问题:PyInstaller问题,非常接近我的问题,但绝对没有答案.


Edit3:删除日志记录的详细信息,与问题无关.

Shi*_*ish 10

首先,在读取之前执行print config_file/os.path.exists(config_file)可能是明智之举,因此您可以确定文件的位置以及python是否可以找到它.

至于实际访问它,os.path.split(__file__)看起来几乎是正确的,但我不确定它在pyinstaller下是否正常 - 包装文件的正确方法是将它们添加到.spec文件中,然后pyinstaller将在编译时加载它们并将它们解压缩到$ _MEIPASS2 /在运行时.要在打包模式下获取_MEIPASS2目录并在解压缩(开发)模式下使用本地目录,我使用:

def resource_path(relative):
    return os.path.join(
        os.environ.get(
            "_MEIPASS2",
            os.path.abspath(".")
        ),
        relative
    )


# in development
>>> resource_path("logging.conf")
"/home/shish/src/my_app/logging.conf"

# in deployment
>>> resource_path("logging.conf")
"/tmp/_MEI34121/logging.conf"
Run Code Online (Sandbox Code Playgroud)