Python pyinstaller似乎找不到数据文件

Python pyinstaller似乎找不到数据文件,python,pyinstaller,Python,Pyinstaller,编辑3:当我需要知道脚本/可执行文件的位置时,我用sys.argv[0]替换了\uuu文件。这并不完全相同,但在我的情况下,它似乎运行良好(至少在可执行版本上…)。现在一切正常,在一个文件模式下,使用accepted answer的功能访问资源文件 编辑2:如接受答案的评论所示,问题来自我脚本中的路径解析;我尝试使用\uuuuuuuuuuuuuuuuuuuuuuuuuu获取脚本的位置,以便访问其资源文件。这在打包后就不起作用了,因为\uuuuu file\uuuuu会将文件名从Python.d

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


编辑2:如接受答案的评论所示,问题来自我脚本中的路径解析;我尝试使用
\uuuuuuuuuuuuuuuuuuuuuuuuuu
获取脚本的位置,以便访问其资源文件。这在打包后就不起作用了,因为
\uuuuu file\uuuuu
会将文件名从
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'
C:\ProgramFiles\PyInstaller\PyInstaller-1.5.1>p_tool\dist\p_tool\p_tool.exe-?
回溯(最近一次呼叫最后一次):
文件“”,第104行,在
文件“p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/logging.config”,第76行,在f中
ileConfig
文件“p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/logging.config”,第112行,在
_创建格式化程序
文件“p_tool\build\pyi.win32\p_tool\outPYZ1.pyz/ConfigParser”,第532行,通用电气公司
T
ConfigParser.NoSectionError:没有节:“格式化程序”
我的第一个想法是,
logging.conf
文件丢失了,所以我在
p_tool.spec
文件中添加了它(以及其他一些资源文件),但这并不更好

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

有人有这个问题吗?唯一相关的话题是以下问题:,非常接近我的问题,但毫无希望地没有得到答案



Edit3:删除了有关日志记录的详细信息,因为这与问题无关。

错误消息
ConfigParser.NoSectionError:No section:'formatters'
表明您应该查找的不是缺少的文件,而是缺少部分的文件。

我有类似的问题,但到目前为止还没有找到一个完美的修复方法。我使用的“hack”让我感到厌烦,比如说我的项目位于
“~/project/project\u root”
,首先在.spec文件中:

excluded_sources = TOC([x for x in a.pure if not x[0].startswith('project_root')])
这里有一个
Analysis
对象,基本上我从
PYZ
中删除了所有的项目文件,因此不会在那里传递导入,也不会从那里计算记录器的相对路径。之后,从项目中创建一个
对象

my_project_tree = Tree('~/project')
然后将此树添加到传递给COLLECT的TOC列表中,以便:

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

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

首先,明智的做法是在读取之前先打印config_文件/os.path.exists(config_文件),这样您就可以确定文件的位置以及python是否可以找到它

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

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"

我更新了这个问题,但我怀疑这个文件是否真的有问题,因为Python版本运行时没有问题。所以我认为这更像是一个访问文件的问题。嗯,好吧,看起来很棘手,但不是我力所能及的。但问题是:
pyc
文件是否会使用嵌入式Python可执行文件执行?我的意思是,这会在安装或不安装Python的任何计算机上运行吗?是的,它们应该运行,只要是相同的操作系统。我只在debian Squence上测试过它,但不能保证。我添加了更多关于日志配置的细节。你能看一下吗?也许我配置资源文件的方式导致了
PyInstaller
的问题。关于代码的第二条评论:您是否使用
excluded_sources
,如下所示:
pyz=pyz(a.pure-excluded_sources)
?如果是,则a中x的
not
可能太多。纯If*not*x[0]。开始使用(…
。我可能不理解它,因为它仍然不起作用;但是拥有
pyc
文件,如果是为任何Python版本打包的话,总比没有好。这里有一些消息。问题来自于
\uuuu file\uuu
没有返回预期值的事实。因此,我最终使用了
sys.argv[0]
来确定被调用的可执行文件的位置。我希望这不会有任何副作用,因为这是我所能想象的解决这个问题的所有方法。无论如何,谢谢你的帮助!这个答案充满了好的建议。因此,首先,打印我要查找的路径显示,
\uuuuuu文件\uuuu
被解析为脚本,相对于
Pyth在.dll上,这意味着在我的情况下,
os.path.split(…)[0]
始终为空。否则,我的脚本就好像是调用它的任何位置的本地脚本……所以现在我必须找到另一种方法来访问我的资源文件