【问题标题】:run os.system command as subprocess python运行 os.system 命令作为子进程 python
【发布时间】:2015-08-10 20:03:57
【问题描述】:

我想将以下 os.system 命令作为子进程运行以了解其 pid,因为我希望能够执行

proc.terminate()

Bellow 是有效的os.system() 命令。请注意,下面的命令已经打开了一个子shell,因为这就是setview 正在做的事情,然后在该子shell 中执行一个python 脚本,然后退出该子shell。

   os.system("/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001")

我试过了

import subprocess
cmd = "/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001"
p=subprocess.Popen(cmd.split(), shell=True)

取自这个 stackoverflow 线程:How to determine pid of process started via os.system 但它只执行第一个/usr/atria/bin/cleartool 而不是其他命令。任何人都知道如何编写一个等效于我的 os.system 调用的子shell?

提前致谢。

【问题讨论】:

标签: python operating-system subprocess


【解决方案1】:

.split 在这里对您没有任何帮助,因为引号中有您不想拆分的空格。要么直接传递一个字符串,让shell处理参数分离:

cmd = "/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001"
p=subprocess.Popen(cmd, shell=True)

或者手动分离命令:

cmd = [
    "/usr/atria/bin/cleartool",
    "setview",
    "-exec",
    # single quotes in the argument no longer required, as we're not going through the shell
    "/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py",  
    "testUser__project_5_0_myProject_001"
]
p = subprocess.Popen(cmd)

【讨论】:

  • @anders: shlex.split() 可用于获取列表。这里不需要shell=True
【解决方案2】:

你为什么要拆分你的命令?不要使用 cmd.split()。试试这个:

import subprocess
cmd = "/usr/atria/bin/cleartool setview -exec '/usr/bin/python /home/testUser/Development/Scripts/setDoneFlag_Count_Lines.py' testUser__project_5_0_myProject_001"
p=subprocess.Popen([cmd], stdout=subprocess.PIPE,shell=True)
out, err = p.communicate()
print out

【讨论】:

  • 这将尝试运行名为/usr/atria/bin/cleartool setview... 的可执行文件,即所有参数都将被视为可执行文件名称的一部分
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 2015-10-29
  • 2020-07-25
  • 2021-12-07
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多