【问题标题】:How does subprocess.Popen differ between Windows and Mac OS?Windows 和 Mac OS 之间的 subprocess.Popen 有何不同?
【发布时间】:2012-11-25 00:51:53
【问题描述】:

我一直在 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 电脑以运行相同的代码,但它不起作用,因为我认为我需要更改路径。这是我的第一个猜测......

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”中,确实如此。我有点不知道下一步该怎么做

【问题讨论】:

  • 您是否尝试过完全扩展路径? Popen 不会像 ~ 这样扩展 shell 快捷方式,除非您使用 shell=True(在这种情况下,shell 会解析命令并处理这些命令)。

标签: python macos subprocess


【解决方案1】:

问题不在于 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 会将您的所有参数放在一个命令行中以传递到外壳,外壳确实处理~。但你不想那样做。只需致电expanduser

为了将来的参考,shell 所做的所有其他类型的扩展也是如此。你不能做"${HOME}/foo",但你可以做os.path.expandvars("${HOME}/foo")。你不能做"foo$((1+1))bar";你必须做类似"foo%sbar" % (1+1,)的事情。以此类推。

【讨论】:

猜你喜欢
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2017-07-21
  • 2010-09-26
相关资源
最近更新 更多