Pyinstaller不允许使用MacOS进行多处理



我有一个python文件,我想将其打包为MacOS 11.6的可执行文件。

python文件(称为Service.py(依赖于另一个json文件,并且在使用python运行时运行得非常好。我的文件使用argparse,因为参数可能会根据需要而有所不同。

如何使用python调用文件的示例:

python3 Service.py -v Zephyr_Scale_Cloud https://myurl.cloud/ philippa@email.com password1 group3

当文件是可执行文件时,它以完全相同的方式运行:

./Service.py -v Zephyr_Scale_Cloud https://myurl.cloud/ philippa@email.com password1 group3

我可以使用PyInstaller对文件进行打包,然后运行可执行文件。

用于打包文件的命令:

pyinstaller --paths=/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/ Service.py

然而,当我谈到需要多处理的问题时,这些论点就会丢失。我的第二个论点(此处记为https://myurl.cloud)是我需要的URL。

我看到的错误是:

[MAIN] Starting new process RUNID9157
url before constructing the client recognised as pipe_handle=15
usage: Service [-h] test_management_tool url
Service: error: the following arguments are required: url
Traceback (most recent call last):
File "urllib3/connection.py", line 174, in _new_conn
File "urllib3/util/connection.py", line 72, in create_connection
File "socket.py", line 954, in getaddrinfo

我已经做了一些日志记录,url确实得到了正确的读取。但是,一旦进程开始并获取所需内容,url就会更改为"pipe_handle=x",在上面的代码中,它是pipe_handle=15。我需要url来检索身份验证令牌,但它只是停止被读取为正确的值,并被更改为这个pipe_handle值。我不知道为什么。

其他人看到了吗?!

我使用的是Python 3.9、PyInstaller 4.4和ArgParse。我还添加了

if __name__ == "__main__":
if sys.platform.startswith('win'):
# On Windows - multiprocessing is different to Unix and Mac.
multiprocessing.freeze_support() 

到我的if名称=";主";我在其他帖子上看到了这一点,但这并没有帮助。

有人能帮忙吗?

通过sys.argv发送命令由于多处理的";"产卵";start方法使用它来传递父级和子级之间初始通信管道的文件描述符。

我在这里进行了一些预测,因为您没有分享如何/在哪里调用argparse以及如何/在何处调用多处理的代码

如果您正在解析if __name__ == "__main__":之外的args,则在sys.argv被子级中的multiprocessing.spawn.prepare()自动清除之前,这些args可能会被解析(在子级import __main__上重新解析(。您应该能够通过在目标函数中移动argparse内容来解决这个问题。也可以更容易地解析父函数中的参数,并将解析后的结果作为参数发送给目标函数。关于sys.argvmultiprocessing的进一步讨论,请参见我的回答。

最新更新