我有以下代码需要独立于平台,而目前还没有:
这可以在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版本时,它只是启动解释器。
有人知道如何在不同平台上统一这个代码吗?
答案 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
时传递一个字符串,只要它只是要执行的程序的名称。但是,如果你遵守上述规则,你就不会出错。