Python 子进程

5 投票
6 回答
6180 浏览
提问于 2025-04-15 13:24

我通常在Linux上手动执行一个Fortran文件,步骤如下:

  1. 连接到服务器
  2. 进入特定的文件夹
  3. ifort xxx.for -o xxx && ./xxx(这里的'xxx.for'是我的Fortran文件,'xxx'是生成的可执行文件)

但是我需要从Python中调用我的Fortran文件(xxx.for),因为我还是个初学者,所以我用了subprocess这个模块,命令如下:

cmd = ["ssh", sshConnect, "cd %s;"%(workDir), Fortrancmd %s jobname "%s -o  %s" exeFilename "%s && %s ./ %s%s"%(exeFilename)]

但是我遇到了一个错误,我不太确定哪里出了问题。以下是完整的代码:

import string
import subprocess as subProc
from subprocess import Popen as ProcOpen
from subprocess import PIPE
import numpy
import subprocess

userID = "pear"
serverName = "say4"
workDir = "/home/pear/2/W/fortran/"
Fortrancmd = "ifort"
jobname = "rad.for"
exeFilename = "rad"

sshConnect=userID+"@"+servername

cmd=["ssh", sshConnect, "cd %s;"%(workDir), Fortrancmd %s jobname "%s -o  %s" exeFilename "%s && %s ./ %s%s"%(exeFilename)]

**#command to execute fortran files in Linux
**#ifort <filename>.for -o <filename> && ./<filename> (press enter)

**#example:ifort xxx.for -o xxx && ./xxx (press enter)

print cmd

我该如何编写一个Python程序,完成上述三个步骤,并避免我遇到的错误呢?

6 个回答

1

有一个错误:
你的参数列表中有一个没有用引号括起来的 %s,所以你的字符串格式化会失败。

2

对于手动操作,你可以看看 pexpect,如果你是用Windows的话,可以试试 wexpect。这两个工具可以让你在交互式环境下执行子进程并传递输入。

不过,你所做的事情大部分听起来更适合用shell脚本来完成。为了简单起见,你可以在服务器上写一个shell脚本来处理服务器端的操作,然后在ssh命令中插入这个脚本的路径:

ssh user@host "/path/to/script.sh"
3

这里有一些语法错误...

原始内容:

cmd=["ssh", sshConnect, "cd %s;"%(workDir), Fortrancmd %s jobname "%s -o  %s" exeFilename "%s && %s ./ %s%s"%(exeFilename)]

我觉得你想表达的是:

cmd = [
      "ssh",
      sshConnect,
      "cd %s;" % (workDir,),
      "%s %s -o  %s && ./%s" % (Fortrancmd, jobname, exeFilename, exeFilename)
      ]

几点说明:

  • 一个只有一个元素的元组,最后需要加个逗号,比如 (workDir,),这样才能被识别为元组,而不是普通的括号。
  • 用一个字符串格式化操作来构建你的 Fortran 命令可能会更简单。

PS - 为了让内容更易读,通常把长列表分成多行是个好主意 :)

我的建议

我建议你查看一下 这个关于 SSH 的 StackOverflow 讨论,而不是使用 subprocess。

撰写回答