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

Ein*_*nar 5 python pyinstaller

精简版:

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

我需要在 Python 脚本中编写什么才能获得相当于在终端中编写的内容:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
Run Code Online (Sandbox Code Playgroud)

长版:

我正在使用一个需要使用 PyInstaller 来分发可执行文件的库。但是我必须运行一次 PyInstaller,然后更改规范文件,然后通过 PyInstaller 运行规范文件。

所以在终端我会这样做:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
Run Code Online (Sandbox Code Playgroud)

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

>python -m PyInstaller WorkLogger.spec
Run Code Online (Sandbox Code Playgroud)

我编写了一个脚本,通过运行为我完成体力劳动

>change_spec.py
Run Code Online (Sandbox Code Playgroud)

但我最终想在一个 Python 脚本中完成所有这些。我希望能够输入这样的东西:

>distribute_python_project.py ./Worklogger
Run Code Online (Sandbox Code Playgroud)

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

#Psuedocode:
#python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
#Code from change_spec.py
#python -m PyInstaller WorkLogger.spec
Run Code Online (Sandbox Code Playgroud)

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

cod*_*der 9

Berniiiiii 的回答是正确的,但没有直击主题,我个人觉得有点令人困惑。

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

import PyInstaller.__main__

PyInstaller.__main__.run([
    'my_script.py',
    '--onefile',
    '--windowed'
])
Run Code Online (Sandbox Code Playgroud)

相当于:

pyinstaller my_script.py --onefile --windowed
Run Code Online (Sandbox Code Playgroud)

  • 基本上,您在命令行上拥有的任何字符串都可以在数组中输入: PyInstaller.__main__.run([ 'some_script.py', '--name', 'my_exe_name', '--specpath', 'some_dir ', '--paths', 'some_other_dir', '--onefile', '--windowed' ]) 这意味着:像平常一样编写完整的命令行,然后将其分解为字符串,然后在数组,每个字符串一个 (2认同)

Ein*_*nar 5

感谢员工和 Canh!工作概念证明:

终端:

>python -m PyInstaller --noconsole --name WorkLogger ../WorkLogger/main.py
Run Code Online (Sandbox Code Playgroud)

蟒蛇脚本:

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

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

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


小智 5

如果需要,您甚至可以使用规范文件直接访问 PyInstaller 的模块。在此示例中,spec-file、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])
Run Code Online (Sandbox Code Playgroud)