我有一个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.argv
和multiprocessing
的进一步讨论,请参见我的回答。