如何从脚本而不是终端使用PyInstaller?

时间:2018-10-03 22:46:23

标签: python pyinstaller

简短版本:

如何从Python脚本而不是从终端使用PyInstaller?

我需要在Python脚本中编写什么才能等同于在终端中编写此脚本:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

长版:

我使用的库要求使用PyInstaller分发可执行文件。但是我必须运行一次PyInstaller,然后更改规格文件,然后通过PyInstaller运行规格文件。

所以在终端中,我会这样做:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

运行完成后,我手动更改规格文件。然后我运行:

>python -m PyInstaller WorkLogger.spec

我编写了一个脚本,该脚本通过运行来为我做手工工作

>change_spec.py

但是我最终想要在一个Python脚本中完成所有这些工作。我希望能够输入如下内容:

>distribute_python_project.py ./Worklogger

这意味着我的Python脚本需要看起来像这样:

#Psuedocode:
#python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
#Code from change_spec.py
#python -m PyInstaller WorkLogger.spec

但是我不知道如何从python脚本而不是从终端使用PyInstaller。这可能吗? (对于那些感兴趣的人,我使用的图书馆是Kivy)。

3 个答案:

答案 0 :(得分:2)

感谢员工和Canh!有效的概念证明:

终端

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py

Python脚本:

subprocess.call(r"python -m PyInstaller --noconsole --name WorkLogger F:\KivyApps\WorkLogger\main.py")

如果需要,您可以从特定的工作目录启动子流程

subprocess.call(r"python -m PyInstaller --noconsole --name WorkLogger F:\KivyApps\WorkLogger\main.py", cwd=r"F:\KivyApps\WorkLogger_Dist")

答案 1 :(得分:0)

如果需要,您甚至可以使用规范文件直接访问PyInstaller的模块。在此示例中,这与spec文件,dist-dir和build-dir的位置不同。

import PyInstaller

# my spec file in "dev\config" dir
workdir = os.getcwd()
fn_msi_spec = os.path.join(workdir, 'main_msi.spec')

# define the "dev\dist" and "dev\build" dirs
os.chdir("..")
devdir = os.getcwd()
distdir = os.path.join(devdir, 'dist')
builddir = os.path.join(devdir, 'build')

# call pyinstaller directly
PyInstaller.__main__.run(['--distpath', distdir, '--workpath', builddir, fn_msi_spec])

答案 2 :(得分:0)

Berniiiii的答案是正确的,但并非直截了当,我个人认为这有点令人困惑。

这是官方文档的回答:running-pyinstaller-from-python-code

import PyInstaller.__main__

PyInstaller.__main__.run([
    'my_script.py',
    '--onefile',
    '--windowed'
])

等效于:

pyinstaller my_script.py --onefile --windowed