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

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

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

最佳答案

问题不在于 Windows 和 Mac 之间的差异,而在于 Windows 和 Mac 之间的差异。这是因为您仅在 Mac 上使用 ~,并且不能在路径名中使用 ~

换句话说,~/code/stochastic/main_plot.py 不是真正的路径名,或者更确切地说,它是,但它正在寻找名为 ~ 的目录code> 在当前目录下,而不是您的主目录下。 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 就会将所有参数放在一起传递到 shell 的命令行中,shell 确实会处理 ~。但你不想这样做。只需调用expanduser即可。

为了将来的引用,对于 shell 所做的所有其他类型的扩展来说,同样的情况也是如此。您不能执行"${HOME}/foo",但可以执行os.path.expandvars("${HOME}/foo")。你不能这样做 "foo$((1+1))bar";你必须做类似 "foo%sbar"% (1+1,) 的事情。等等。

关于python - subprocess.Popen 在 Windows 和 Mac OS 之间有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13753001/

相关文章:

python - Nuke Viewer 设置帧范围问题

python - 将输入传递给 Popen 进程

node.js - 不使用 sudo 就无法运行大多数 cordova 命令

c - 在 Mac 上编程 USB 设备

objective-c - 在 Cocoa View 层次结构中,什么决定了 subview 的位置?

python - 如何通过 mailx 和子进程发送邮件?

python - NCO 下载 Python

python - 重试中断的系统调用时出现问题

python - 我怎样才能让 Python 找到 ffprobe?

python - 在 python 中以管理员身份运行批处理文件