pyinstaller似乎找不到数据fi

2024-06-02 20:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑3:当我需要知道脚本/可执行文件的位置时,我将__file__替换为sys.argv[0]。这并不完全相同,但在我的情况下,似乎运行良好(至少在可执行版本…)。现在一切正常,在一个文件模式下,使用accepted answer的功能访问资源文件!


编辑2:如accepted answer的评论所示,问题来自脚本中的路径解析;我试图使用__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'

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

Python版本:2.6.6,在WinXP下。我正在使用pyinstaller,因为我需要它来为Solaris工作站打包文件。

有人有这个问题吗?唯一相关的主题是下面的问题:PyInstaller Problem,非常接近我的问题,但无可救药地没有答案。


Edit3:关于日志记录的详细信息已删除,因为与问题没有实际关系。


Tags: 文件inbuild路径脚本line资源tool
3条回答

错误消息ConfigParser.NoSectionError: No section: 'formatters'表明它不是一个丢失的文件,而是一个应该查找的缺少节的文件。

我也遇到过类似的问题,但到目前为止还找不到一个很好的解决方法。我使用的“黑客”让我陷入困境,比如我的项目位于'~/project/project_root',首先在.spec文件中:

excluded_sources = TOC([x for x in a.pure if not x[0].startswith('project_root')])

这里a是Analysis对象,基本上我从PYZ中删除了所有项目文件,因此不会在那里传递导入,也不会从那里计算记录器的相对路径。之后,从项目中创建一个Tree对象。

my_project_tree = Tree('~/project')

然后将此树添加到传递给收集的目录列表中,以便:

COLLECT( exe,
           a.binaries,
           a.zipfiles,
           a.datas,
           my_project_tree,
           ....)

您应该将项目文件夹添加到dist文件夹中。问题是你最终也会分发你项目的pyc,但是到目前为止还没有找到更好的方法。对有效的解决方案非常感兴趣。

首先,在读取之前,最好先打印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"

相关问题 更多 >