使用onefile选项在Pyinstaller中添加数据文件

时间:2018-06-27 10:48:47

标签: python python-3.x python-3.6 pyinstaller

我正在尝试将图像添加到Pyinstaller生成的一个文件中。我已经阅读了许多类似oneone这样的问题/论坛,但仍然无法正常工作。

我知道,对于一个文件操作,Pyinstller会产生一个<!DOCTYPE html> <html> <head> <title>Login form</title> <link rel="stylesheet" type="text/css" href="Login Form CSS.css"> <script src="Registration function.js" defer></script> <body> <div class="loginbox"> <img src="Logo.jpg" class="avatar"> <h1> Create Account </h1> <form name="login-form"> <div id="forename_confirmation"> Please fill in this box </div> <div id="forename_chars"> Don't use special characters</div> <p>Forename <p> <input type="text" name="forename" id="forename" placeholder="Enter Forename here"> <div id="surname_confirmation"> Please fill in this box </div> <div id="surname_chars"> Don't use special characters</div> <p>Surname <p> <input type="text" name="surname" id="surname" placeholder="Enter Surname here"> <div id="username_confirmation"> Please fill in this box </div> <div id="username_chars"> Don't use special characters</div> <p>Username <p> <input type="text" name="username" id="username" placeholder="Enter Username here"> <div id="pass_confirmation"> Please fill in this box </div> <div id="pass_chars">Don't use special characters</div> <p>Password <p> <input type="password" name="password" id="password" placeholder="Enter Password here"> <div id="repass_confirmation"> Passwords do not match </div> <p>Re-enter Password <p> <input type="password" name="re_password" id="re_password" placeholder="Re-enter your password here"> <div id="email_confirmation"> Please enter a valid email </div> <p>Email <p> <input type="email" name="email" id="email" placeholder="Enter Email here"> <!-- <p>Gender<p> <input type="radio" id="Male" name="Gender" value="Male">Male</input> <input type="radio" id="Female" name="Gender" value="Female">Female</input> --> <button onclick="validate_form(event)" type="Submit" value="True" name="button-submit"> Submit </button> <br /> <br /> <a href="#"> Forgot your password? </a> <br /> <a href="#"> Already got an account? </a> <br /><br /> </form> <!-- <button onclick="validate_form()" type="submit"> Validate </button> --> </div> </body> </head> <script> forename_confirmation.style.visibility = 'hidden' forename_chars.style.visibility = 'hidden' surname_confirmation.style.visibility = 'hidden' surname_chars.style.visibility = 'hidden' username_confirmation.style.visibility = 'hidden' username_chars.style.visibility = 'hidden' pass_confirmation.style.visibility = 'hidden' pass_chars.style.visibility = 'hidden' repass_confirmation.style.visibility = 'hidden' email_confirmation.style.visibility = 'hidden' </script> </body> </html>可以到达的临时文件夹。但是我不知道 我应该在脚本的确切位置添加 sys.MEIPASS

请显示以下内容:

1- 在何处以及如何添加 sys.MEIPASS?在python脚本中还是在spec文件中?

2-要使用的确切命令是什么?我已经尝试过

sys.MEIPASS

pyinstaller --onefile --windowed --add-data="myImag.png;imag" myScript.py

,然后将('myImag.png','imag')添加到规范文件,然后运行

pyinstaller --onefile --windowed myScript.py

没有一个工作。

注意:我在Windows 7下有python 3.6

4 个答案:

答案 0 :(得分:2)

使用PyInstaller打包为单个文件时,运行.exe将把所有内容解压缩到TEMP目录中的文件夹中,运行脚本,然后丢弃这些临时文件。每次运行时,临时文件夹的路径都会更改,但是会将其位置的引用作为sys添加到sys._MEIPASS

要利用这一点,当您的Python代码读取也会打包到.exe中的任何文件时,您需要将文件位置更改为位于sys._MEIPASS下。换句话说,您需要将其添加到您的python代码中。

以下是一个示例,该示例使用您引用的链接中的代码将文件路径打包到单个文件时,将文件路径调整为正确的位置。

示例

# data_files/data.txt
hello
world

# myScript.py
import sys
import os

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

def print_file(file_path):
    file_path = resource_path(file_path)
    with open(file_path) as fp:
        for line in fp:
            print(line)

if __name__ == '__main__':
    print_file('data_files/data.txt')

使用以下选项运行PyInstaller会将文件打包:

pyinstaller --onefile --add-data="data_files/data.txt;data_files" myScript.py

构建myScript.exe,该脚本可以正常运行,并且可以打开和读取打包的数据文件。

答案 1 :(得分:0)

这是我最终使用的命令提示符命令提示符,因为我的.spec无法正常工作。 它排除了形状,然后将其重新添加(pyinstaller很难将其编译到--onefile中,因此我必须“手动”添加模块)。这显示了如何添加文件夹而不只是文件。

pyinstaller --clean --win-private-assemblies --onefile --exclude-module shapely --add-data C:\ Python27 \ Lib \ site-packages \ shapely;。\ shapely --add-data C :\ Python27 \ tcl \ tkdnd2.8; tcl main.py

答案 2 :(得分:0)

我尝试更改了python脚本的工作目录,但似乎可行:

import os 
import sys

os.chdir(sys._MEIPASS)
os.system('included\\text.txt')

我的pyinstaller命令:

pyinstaller --onefile --nowindow --add-data text.txt;included winprint.py --distpath .

答案 3 :(得分:0)

通过以下方式访问temp文件夹的更简单方法:

bundle_dir = getattr(sys, '_MEIPASS', path.abspath(path.dirname(__file__)))
data_path = os.path.abspath(path.join(bundle_dir, 'data_file.dat'))

从阅读文档中得到它