python子进程
我通常在Linux中(手动)执行Fortran文件,如下所示:python子进程,python,ssh,subprocess,Python,Ssh,Subprocess,我通常在Linux中(手动)执行Fortran文件,如下所示: 连接到服务器 转到特定文件夹 ifort xxx.for-o xxx&./xxx(其中“xxx.for”是我的Fortran文件,“xxx”是Fortran可执行文件) 但是我需要从python(我是初学者)调用我的fortran文件(xxx.for),所以我使用了subprocess和以下命令: cmd = ["ssh", sshConnect, "cd %s;"%(workDir), Fortrancmd %s jobname
ifort xxx.for-o xxx&./xxx
(其中“xxx.for”是我的Fortran文件,“xxx”是Fortran可执行文件)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
导入字符串
将子流程作为SubPC导入
从子流程导入Popen作为ProcOpen
从子流程导入管道
进口numpy
导入子流程
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作业名“%s-o%s”exeFilename“%s&&%s./%s%s”%(exeFilename)]
**#在Linux中执行fortran文件的命令
**#ifort.for-o&&./(按enter键)
**#示例:ifort xxx.for-o xxx&./xxx(按enter键)
打印命令
如何编写一个python程序来执行上述所有3个步骤并避免出现错误?您必须使用python吗
sshuser@host“命令”用于您可能要查看的手动部分或windows。这些允许您在交互条件下执行子流程和传递输入 不过,您正在做的大部分工作听起来都可以在shell脚本中正常工作。为简单起见,您可以在服务器端为服务器端操作生成一个shell脚本,然后插入ssh语句中的路径:
ssh user@host "/path/to/script.sh"
一个错误:您的参数列表中有一个未加引号的%s,因此字符串格式设置将失败。有一些语法错误 原件:
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,)的末尾加一个逗号,才能将其解释为元组(与简单的操作顺序参数相比)
- 使用单个字符串格式操作可能更容易构造fortan命令
我建议查看而不是使用子流程,下面是一个使用子流程模块通过ssh(在本例中是一个简单的回显)运行远程命令并获取结果的完整示例,希望有帮助:
>>> import subprocess
>>> proc = subprocess.Popen(("ssh", "remoteuser@host", "echo", "1"), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> stdout, stderr = proc.communicate()
在本例中返回:('1\n','')
请注意,要在不需要密码的情况下实现此功能,您可能需要将本地用户的公钥添加到远程计算机上的~remoteuser/.ssh/authorized_密钥。您可以在步骤1和2中使用。
这是基本思想:
from fabric.api import *
env.hosts = ['host']
dir = '/home/...'
def compile(file):
with cd(dir):
run("ifort %s.for -o %s" %(file,file))
run("./%s > stdout.txt" % file)
- 创建fabfile.py
- 然后运行
fab compile:filename