【问题标题】:multiprocessing.manager issue sys.argsmultiprocessing.manager 问题 sys.args
【发布时间】:2012-12-22 14:15:14
【问题描述】:

我在一个多处理的小型 Windows 服务应用程序中运行以下 python 代码行。

multiprocessing.Manager()

问题是在运行 Windows 服务时,模块 sys 集中似乎没有属性 argv。因此,我在 python 多处理分叉库中出现以下错误。我希望有人能对这个问题有所了解。

问题的堆栈跟踪(在 windows 服务中运行 multiprocessing.Manager 时):

 File "C:\python27\lib\multiprocessing\__init__.py", line 99, in Manager
    m.start()
  File "C:\python27\lib\multiprocessing\managers.py", line 524, in start
    self._process.start()
  File "C:\python27\lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "C:\python27\lib\multiprocessing\forking.py", line 252, in __init__
    cmd = get_command_line() + [rhandle]
  File "C:\python27\lib\multiprocessing\forking.py", line 339, in get_command_line
    if process.current_process()._identity==() and is_forking(sys.argv):
AttributeError: 'module' object has no attribute 'argv

更新

我的问题的一个可能解决方案是,如果在运行时未设置 sys.argv 值,则我手动设置它,但这似乎非常不合 Python。但可能是唯一的解决方案。 stackoverflow 人是怎么想的?

if not hastattr(sys, 'argv'):
    sys.argv = []

但是,这会导致我在 multiprocessing.manager 中遇到一个新问题,代码中会出现意外的 EOFError。

  File "C:\python27\lib\multiprocessing\__init__.py", line 99, in Manager
    m.start()
  File "C:\python27\lib\multiprocessing\managers.py", line 528, in start
    self._address = reader.recv()
  EOFError

【问题讨论】:

  • 我现在无法访问 Windows 系统,但是如果您明确设置了 sys.argv = []?
  • @ldx.a.ldy.c 啊,是的,我打算将此作为可能的解决方案,只是想知道这是否是解决此问题的唯一方法。我应该这样做似乎有点不合时宜。它还会导致我在帖子更新中描述的错误。
  • 在以独立方式进行单元测试时,我遇到了 Update 中提到的问题。正常运行和在 PyDev 中进行单元测试时,一切都按预期工作。您是否曾在 Update 中解决过您的问题?

标签: python windows windows-services multiprocessing python-multiprocessing


【解决方案1】:

由于设置 sys.argv = [] 不起作用,如果有脚本名称,您可以使用 do sys.argv = ['scriptname'] 或仅使用 sys.argv = ['']。后者是你运行python得到的,导入sys然后查看sys.argv,例如,

~$ python
>>> import sys
>>> sys.argv
['']

【讨论】:

  • 感谢@sigmavirus24 的评论,即使我按照您所说的进行操作,我仍然遇到问题中列出的第二个异常。我不确定这是否是一个可能的 python 错误
  • 只是猜测。我从来没有见过这个问题,而且我经常使用多处理。您最好在 freenode 上的#python 中提问。他们中的很多人都比我知识渊博。
【解决方案2】:

在 Python 初始化后调用该函数:

PySys_SetArgv(argc, argv);

解释器无法以其他方式访问 argc/argv,而是从 main() 显式传递它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 2012-03-15
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多