subprocess.Popen的平台无关示例

时间:2014-02-20 18:04:32

标签: python linux

我有以下代码需要独立于平台,而目前还没有:

这可以在windows中启动python脚本“pb_cli.py”

proc = subprocess.Popen(["python","pb_cli.py","get_token","60"], stdout=subprocess.PIPE, shell=True, cwd = '.',)
(result, err) = proc.communicate()

然而 - 这似乎在Linux中不起作用。在Linux中,我需要这样做:

proc = subprocess.Popen(["python pb_cli.py get_token 60"], stdout=subprocess.PIPE, shell=True, cwd = '.',)
(result, err) = proc.communicate()

当我尝试在Windows上使用Linux版本时,出现以下错误:

C:\Users\Documents\Code\STAGE\cli>python move_users.py --input=users.txt --username --source_account=531 --destination_account=9
'"python pb_cli.py get_token 60"' is not recognized as an internal or external command, operable program or batch file.

当我尝试在Linux上使用Windows版本时,它只是启动解释器。

有人知道如何在不同平台上统一这个代码吗?

1 个答案:

答案 0 :(得分:2)

对于任何操作系统,当shell=False(默认情况下)时,第一个参数应该是一个列表:

Popen(["python","pb_cli.py","get_token","60"], stdout=subprocess.PIPE)

shell=True时,第一个参数应该是一个字符串:

subprocess.Popen("python pb_cli.py get_token 60", shell=True, stdout=subprocess.PIPE)

PS。尽量避免使用shell=True,因为它可以是security risk


实际规则有点复杂。 The docs say

  

如果传递单个字符串,则shell必须为True(参见下文)或   否则字符串必须简单地命名要执行的程序而不用   指定任何参数。

这意味着你可以在shell=False时传递一个字符串,只要它只是要执行的程序的名称。但是,如果你遵守上述规则,你就不会出错。