Python 子进程
我通常在Linux上手动执行一个Fortran文件,步骤如下:
- 连接到服务器
- 进入特定的文件夹
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,所以你的字符串格式化会失败。
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。