Python/Pyinstaller - 单文件可执行程序

2 投票
3 回答
4883 浏览
提问于 2025-04-29 19:18

为了创建一个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 个回答

0

你可以使用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
0

通过编写一个可以在PowerShell中执行的脚本,

  1. 可以创建并写入一个.exe文件。

  2. 其他文件可以被移动到新目录中。

现在只需要运行这个PowerShell脚本就可以了。

1

我刚接触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测试的。我知道这个问题有点老了,但希望能帮助到遇到这个问题的人。

撰写回答