Python/Pyinstaller - 单文件可执行程序
为了创建一个Python的.exe文件,我一直在使用pyinstaller这个工具,并且使用了这个命令:
pyinstaller --onefile -w -i favicon.ico "program.py"
这个命令会生成一个名为/dist的文件夹,里面包含了生成的.exe文件。问题是,我不能在不把以下程序文件放在.exe文件启动文件夹里的情况下运行这个.exe文件。
+ Dir
- favicon.ico
- logo.gif
- data.csv
- program.exe
我该怎么做才能把.ico、.gif和.csv这些文件放进.exe里,这样它才能真正变成一个“单文件”?
相关文章:
- 暂无相关问题
3 个回答
你可以使用pyinstaller的 --add-data
选项来打包文件。比如,针对你的文件,你可以尝试:
> pyinstaller --onefile -w -i favicon.ico "program.py" --add-data "favicon.ico:favicon.ico'\
--add-data "lgog.gif:logo.gif" --add-data "data.csv:data.csv"
在其他操作系统上,可能需要把 \
替换成 ^
(或者把所有内容放在一行)。
这样就可以把所有文件打包到exe文件里了。
如果你想在代码中访问这些文件,你需要多加一点设置,否则程序找不到它们。
import os, sys
def resource(relative_path):
if getattr(sys, 'frozen', False):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath('.'), relative_path)
当pyinstaller编译一个脚本时,它会把 _MEIPASS
变量设置为运行时创建文件的临时路径。这个脚本利用这个变量来找到这些文件,并在未编译模式下默认回到普通路径 了解更多。
要在代码中访问这些文件,只需把所有指向文件的链接替换为 resource('myfile.etc')
。例如,使用你的 data.csv
文件:
with open(resource('data.csv'), 'r') as csvfile:
# do stuff
通过编写一个可以在PowerShell中执行的脚本,
可以创建并写入一个.exe文件。
其他文件可以被
移动
到新目录中。
现在只需要运行这个PowerShell脚本就可以了。
我刚接触Python,所以如果代码有点乱请多包涵。我之前也遇到过类似的问题,主要是关于.csv文件的。我通过运行以下代码,把它们打包成了.py文件:
import csv
myfinalvariable=[]
with open(PathToOriginalCsv + '\\' + 'NameOfCsv.csv', newline='') as csvfile:
myfirstvariable = csv.reader(csvfile, delimiter=',', quotechar='|')
for line in myfirstvariable:
myfinalvariable.append(' '.join(line).split())
pyfile=open('PathToDesiredFile\mynewfile.py', 'w')
pyfile.write('newcsv=%s' %(myfinalvariable))
pyfile.close
如果你有多个csv文件,可以重复这个过程。现在你手里有了一个包含“变量”的py文件,你可以“忘记”那些csv文件。因为如果你把这个生成的py文件放到你的“项目文件夹”里,并在代码中加入:
from mynewfile import newcsv, newcsv2, ...
那么你就可以修改代码,使用变量'newcsv'、'newcsv2'等,而不需要再加载原来的csv文件。当你用pyinstaller加上--onefile
这个参数时,它会把'mynewfile.py'打包成一个exe文件。使用--icon=favicon.ico
参数时,Pyinstaller 3.0还会把.ico文件一起打包。这个是在Windows上,使用Python3.4和Pyinstaller3.0测试的。我知道这个问题有点老了,但希望能帮助到遇到这个问题的人。