2015-09-15 94 views
0

我有一个奇怪的问题的作品,我似乎无法化解Python的系统调用,在Windows和Linux

from subprocess import PIPE, Popen 

exeLocation = "../Engine.exe" 

# Works on windows 
proc = Popen([exeLocation, arg1, arg2],stdout=PIPE,shell=True]) 
(out,err) = proc.communicate() 

# Works on Linux 
proc = Popen(" ".join([exeLocation, arg1, arg2]),stdout=PIPE,shell=True]) 
(out,err) = proc.communicate() 

出于某种原因,一个“..”是不是抛出一个命令错误,如果您运行在Windows上的Linux版本。

由于某些原因,“exeLocation arg1 arg2”传递的命令在Linux中不能使用,使用windows版本。

我需要一种方法来使用相同的代码在两个平台上执行此操作。

+1

为什么你不会使用'if'?像'如果os.name =='posix':','elif os.name =='nt':' –

+0

我认为这是一个解决方案,但是一个讨厌的问题。我发现很难相信我无法进行系统调用,并使用相同的代码在python中读取输出流。 – AndrewGrant

+2

你确定你的代码可以工作吗? '壳=真]'? –

回答

1

可移植代码应该使用列表参数(drop shell=True),或者如果需要shell=True,它应该将该命令作为字符串传递。

不要使用相对路径,例如../:要么传递绝对路径(包括文件扩展名),要么依赖于envvar并使用类似于:program = 'engine'