【问题标题】:How to pass a list variable to subprocess.call command in Python如何在 Python 中将列表变量传递给 subprocess.call 命令
【发布时间】:2019-03-05 09:23:10
【问题描述】:

我有一个清单

apps = []
apps.append("wq35a5huqlja45jsyukrpmwuiayovrmh")
apps.append("q7mimvgduueernwvw4y22t5huemykntw")
apps.append("pmudbpyquna2bll53pwqh7gdejxtmchq")

我想把这个列表变量传递给一个linux命令,像这样。

subprocess.call(["service", "delete", apps])

但我收到以下错误。

TypeError: execv() arg 2 必须只包含字符串

我也试过了,但还是不行。

subprocess.call("service delete $apps", shell=True)

有人可以告诉我如何将变量(列表、字典等)传递给 subprocess.call 命令

【问题讨论】:

  • subprocess.call(["service", "delete"] + apps)?
  • 服务的预期语法是什么?如果你可以用subprocess调用它,你可以直接调用它,那么命令行是什么?

标签: python linux shell


【解决方案1】:
subprocess.call(["service", "delete", *apps])

将扩展到

subprocess.call(["service", "delete", "wq35a5huqlja45jsyukrpmwuiayovrmh", ...])

【讨论】:

    【解决方案2】:

    subprocess.call("service delete $apps", shell=True)

    这是错误的,因为apps 不是 shell 变量。传递 python 字符串变量开箱即用。

    In[12]: daemon = 'ntp'
    In[13]: sb.call(["service", daemon, "status"])
    ● ntp.service - LSB: Start NTP daemon
       Loaded: loaded (/etc/init.d/ntp; bad; vendor preset: enabled)
       Active: active (running) since Mon 2019-03-04 01:37:43 IST; 1 day 13h ago
         Docs: man:systemd-sysv-generator(8)
      Process: 2045 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
        Tasks: 1
       Memory: 2.1M
          CPU: 6.816s
       CGroup: /system.slice/ntp.service
               └─2345 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 123:130
    
    Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
    Out[13]: 0
    

    但是,如果要传递字符串以外的任何内容,您必须手动进行一些类型转换,因此对于列表,您必须执行类似的操作。

    >>> a = ['a', 'b', 'c']
    >>> sb.call(["echo", ','.join(a)])
    a,b,c
    0
    

    【讨论】:

      【解决方案3】:

      我赞成 Harly H 的回答,但为了完整起见,这是另一种方式。

      subprocess.run(['xargs', '-0', 'service', 'delete'],
          input='\0'.join(apps)),
          check=True,   # probably a good idea, but not strictly required
          universal_newlines=True)
      

      这需要足够新的 Python 以拥有 subprocess.run(),尽管即使使用 Python 2 subprocess 接口,类似的事情也很容易或至少是可能的。在 3.7+ 中,universal_newlines 更贴切地标记为 text。

      如果apps 是一个非常长的字符串,xargs 也会注意避免任何“参数列表太长”错误。 (谷歌为ARG_MAX。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-19
        • 2018-11-17
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 2015-08-05
        • 2019-09-15
        • 1970-01-01
        相关资源
        最近更新 更多