我目前正在编写一个小型 python 脚本,用于控制我的家用电脑(实际上只是一个爱好项目 - 没什么大不了的)。
在脚本内部,有两个线程同时运行,使用线程(可能开始使用线程),如下所示:
thread.start_new_thread( Function, (Args) )
它在测试脚本时按预期工作......但在使用 Pyinstaller 编译代码后有两个进程(每个线程一个 - 我认为)。
我该如何解决?
我目前正在编写一个小型 python 脚本,用于控制我的家用电脑(实际上只是一个爱好项目 - 没什么大不了的)。
在脚本内部,有两个线程同时运行,使用线程(可能开始使用线程),如下所示:
thread.start_new_thread( Function, (Args) )
它在测试脚本时按预期工作......但在使用 Pyinstaller 编译代码后有两个进程(每个线程一个 - 我认为)。
我该如何解决?
如果它真的困扰你,只需从主程序中杀死加载程序。这是一种方法。
import os
import win32com.client
proc_name = 'MyProgram.exe'
my_pid = os.getpid()
wmi = win32com.client.GetObject('winmgmts:')
all_procs = wmi.InstancesOf('Win32_Process')
for proc in all_procs:
if proc.Properties_("Name").Value == proc_name:
proc_pid = proc.Properties_("ProcessID").Value
if proc_pid != my_pid:
print "killed my loader %s\n" % (proc_pid)
os.kill(proc_pid, 9)
Python 代码不需要“用 pyinstaller 编译”
像“Pyinstaller”或“py2exe”这样的产品对于创建一个可以分发给第三方的可执行文件很有用,或者在你的计算机中重新定位而不用担心 Python 的安装——但是,它们不会增加“速度”,生成的二进制文件也不会文件比原始 .py(或 Windows 上的 .pyw)文件更“完成”。
这些产品所做的是创建 Python itnrepreter 的另一个副本,与您的 porgram 使用的所有模块对齐,并将它们打包到一个文件中。Pyinstaller 可能会继续运行第二个进程来检查主脚本上的内容(比如启动它,也许它上面有保持脚本运行的选项等等)。这不是标准 Python 程序的一部分。
Pyinstaller 不太可能将线程拆分为 2 个单独的进程,因为这会导致兼容性问题 - 线程在同一进程上运行并且可以透明地访问相同的数据结构。
“规范” Python 程序如何运行:操作系统看到的主进程是 Python 二进制文件(Windows 上的 Python.exe)——它会找到调用它的 Python 脚本——如果它有一个“.pyc”文件,即已加载 - 否则,它会加载您的“.py”文件并将其编译为 Python 字节码(而不是 Windwos 可执行文件)。这种编译对运行程序的人来说是自动和透明的。它类似于从 .java 文件到 .class 的 Java 编译 - 但程序员或用户不需要明确的步骤 - 它是就地完成的 - 其他因素控制 Python 是否将生成的字节码存储为 .pyc文件与否。
总结一下:直接运行“.py”脚本而不是使用 Pyinstaller 或其他产品生成 .exe 文件对性能没有影响。但是,如果这样做,您的磁盘空间使用会受到影响,因为您将拥有每个脚本的 Python 解释器和库的副本。
Janne Karila 在评论中指出的 URL 指出了这一点——它比我想象的还要糟糕:为了运行 yioru 脚本,pyinstaller 将 Python DLL 和模块解包到一个临时目录中。与单个脚本运行相比,执行此操作所需的时间和系统资源并非微不足道。 http://www.pyinstaller.org/export/v2.0/project/doc/Manual.html?format=raw#how-one-file-mode-works