代码之家  ›  专栏  ›  技术社区  ›  abalter

python多处理中的字符串参数

  •  29
  • abalter  · 技术社区  · 15 年前

    我试图在进程中将字符串参数传递给目标函数。不知何故,该字符串被解释为一个参数列表,其中包含的参数与字符的数量相同。

    这是代码:

    import multiprocessing
    
    def write(s):
       print s
    
    write('hello')
    
    p = multiprocessing.Process(target=write, args=('hello'))
    
    p.start()
    

    我得到这个输出:

    hello
    Process Process-1:
    Traceback (most recent call last):
    >>>   File "/usr/local/lib/python2.5/site-packages/multiprocessing/process.py", line 237, in _bootstrap
        self.run()
      File "/usr/local/lib/python2.5/site-packages/multiprocessing/process.py", line 93, in run
        self._target(*self._args, **self._kwargs)
    TypeError: write() takes exactly 1 argument (5 given)
    
    >>>
    

    我做错什么了?我该如何通过一条线?

    谢谢,艾莉尔

    3 回复  |  直到 8 年前
        1
  •  67
  •   Smashery    12 年前

    这是python中常见的一个gotcha——如果您想要一个只有一个元素的tuple,您需要指定它实际上是一个tuple(而不仅仅是有括号的东西)——这是通过在元素后添加逗号来完成的。

    要解决此问题,只需在字符串后括号内加一个逗号:

    p = multiprocessing.Process(target=write, args=('hello',))
    

    这样,Python就可以将其识别为一个包含单个元素的元组,如预期的那样。目前,python将代码解释为一个字符串。但是,它以这种特殊的方式失败,因为字符串实际上是字符列表。所以python认为你想传递(‘h’、‘e’、‘l’、‘l’、‘o’)。这就是为什么它说“你给了我5个参数”。

        2
  •  10
  •   Denis Otkidach    15 年前

    变化 args=('hello') args=('hello',) 甚至更好 args=['hello'] . 否则括号不会形成序列。

        3
  •  5
  •   Paul Rooney    8 年前

    你必须通过

    p = multiprocessing.Process(target=write, args=('hello',))
    

    注意逗号!否则,它被解释为一个简单的字符串,而不是一个元素元组。