5

我通常在 Linux 中(手动)执行 Fortran 文件:

  1. 连接到服务器
  2. 转到特定文件夹
  3. 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 "%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

如何编写一个执行上述所有 3 个步骤并避免出现错误的 python 程序?

4

6 回答 6

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)
      ]

几点注意事项:

  • 具有一个元素的元组需要在第一个参数末尾使用逗号 see (workDir,) 被解释为元组(与简单的操作顺序括号相比)
  • 使用单个字符串格式操作构建您的 fortan 命令可能更容易

PS - 为了便于阅读,将长列表分成多行通常是个好主意:)

我的建议

我建议查看ssh 的这个 stackoverflow 线程,而不是使用子进程

于 2009-08-05T15:03:35.030 回答
2

对于手册部分,您可能需要查看pexpect或 windows wexpect。这些允许您在交互条件下执行子流程并传递输入。

但是,您所做的大部分工作听起来都可以在 shell 脚本中正常运行。为简单起见,您可以在服务器端为您的服务器端操作制作一个 shell 脚本,然后在 ssh 语句中插入路径:

ssh user@host "/path/to/script.sh"
于 2009-08-05T14:55:28.850 回答
1

您可以在第 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
于 2012-04-28T14:49:18.850 回答
1

一个错误:
您的参数列表中有一个未引用的 %s,因此您的字符串格式化将失败。

于 2009-08-05T15:01:13.990 回答
1

这是使用 subprocess 模块通过 ssh 运行远程命令(在本例中为简单的 echo)并获取结果的完整示例,希望对您有所帮助:

>>> 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_keys 中。

于 2009-11-26T00:10:40.073 回答
0

你必须使用python吗?

ssh 用户@主机“命令”

于 2009-08-05T14:54:11.520 回答