Python / Pyinstaller - onefile可执行文件

时间:2014-10-26 20:28:51

标签: python windows python-2.7 exe

为了创建一个python .exe文件,我一直在使用pyinstaller和这个命令:

pyinstaller --onefile -w -i favicon.ico "program.py"

这会创建一个/ dist文件夹,其中包含生成的.exe文件。 问题是我无法运行此.exe文件而不在.exe启动文件夹中包含以下程序文件。

+ Dir
  - favicon.ico
  - logo.gif
  - data.csv

  - program.exe

如何在.exe中包含.ico,.gif和.csv,以便真正成为" onefile"?

3 个答案:

答案 0 :(得分: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文件。当您使用带有--onefile参数的pyinstaller时,它会将'mynewfile.py'文件打包到创建的exe文件中。使用参数--icon=favicon.ico时,Pyinstaller 3.0还会打包.ico文件。在Windows,Python3.4,Pyinstaller3.0上测试。我知道这是一个老问题,我希望这可以帮助那些偶然发现它的人。

答案 1 :(得分:0)

通过编写shell脚本,可由powershell执行,

  1. 该文件可以作为.exe文件制作和编写

  2. 其他文件可以moved到新目录中。

  3. 现在所需要做的就是让Powershell脚本运行。

答案 2 :(得分: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变量设置为所创建文件的临时路径。该脚本利用它来定位这些文件,并以未编译模式read more的默认默认路径返回到普通路径。

要通过代码访问文件,只需将所有指向文件的链接替换为resource('myfile.etc')。例如,使用您的data.csv文件

with open(resource('data.csv'), 'r') as csvfile:
    # do stuff