如何将列表变量传递给subprocess.callPython中的命令

2024-10-02 18:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张单子

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

我想把这个list变量传递给一个linux命令,类似这样。在

^{pr2}$

但我有以下错误。在

TypeError: execv() arg 2 must contain only strings

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

^{3}$

有人能告诉我如何将变量(列表、字典e.t.c)传递给subprocess.call命令


Tags: apps命令linux错误arglist单子append
3条回答

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

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

^{pr2}$

我对哈莉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(),尽管类似的东西很容易或者至少在python2subprocess接口中也是可能的。在3.7+universal_newlines中,标记text更合适。在

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

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

将扩展到

^{pr2}$

相关问题 更多 >