subprocess.Popen在Windows和Mac OS之间有何不同?

时间:2012-12-06 21:32:45

标签: python macos subprocess

我一直在Windows上运行一些python代码,使用以下行打开另一个python程序'main_plot.py'...

subprocess.Popen(['C:\\python26\\python.exe ','main_plot.py','-n', str(number_of_cores),'-m', str(number_of_motors)])

我试过ssh到Mac OS pc上运行相同的代码,但它不起作用,因为我认为我需要改变路径。这是我的第一个猜测...

subprocess.Popen(['python','main_plot.py','-n', str(number_of_cores),'-m', str(number_of_motors)])

但我收到了错误......     python:无法打开文件'main_plot.py':[Errno 2]没有这样的文件或目录

我也试过

subprocess.Popen(['python','~/code/stochastic/main_plot.py','-n', str(number_of_cores),'-m', str(number_of_motors)])

但我得到同样的错误。

我已经检查过该文件位于'〜/ code / stochastic'中,它是。我有点卡住了下一步做什么

1 个答案:

答案 0 :(得分:3)

问题不在Windows和Mac之间;这是因为您只在Mac上使用~,并且您无法在路径名中使用~

采用不同的方式,~/code/stochastic/main_plot.py不是真正的路径名 - 或者更确切地说,它是,但它正在寻找当前目录下名为~的目录,而不是您的主目录。 shell使用波浪扩展将其转换为真实路径名。 Python也可以进行波浪扩展,但你必须要求它明确地这样做。

所以,解决方案很简单:

subprocess.Popen(['python',
                  os.path.expanduser('~/code/stochastic/main_plot.py'),
                  '-n', str(number_of_cores),'-m', str(number_of_motors)])

正如Jeremy Roman在评论中指出的那样,如果使用~可以在路径中使用shell=True,因为Python会将所有的args放在一起命令行传递给shell,shell 执行处理~。但你不想这样做。只需致电expanduser

为了将来参考,对于s​​hell所做的所有其他类型的扩展也是如此。您无法执行"${HOME}/foo",但可以执行os.path.expandvars("${HOME}/foo")。你做不到"foo$((1+1))bar";你必须做"foo%sbar" % (1+1,)之类的事情。等等。