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