python子进程

时间:2009-08-05 14:44:41

标签: python ssh subprocess

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

  1. 连接到服务器
  2. 转到特定文件夹
  3. ifort xxx.for -o xxx && ./xxx(其中'xxx.for'是我的Fortran文件,'xxx'是Fortran可执行文件)
  4. 但我需要从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程序并避免我遇到的错误?

6 个答案:

答案 0 :(得分: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,)解释为一个元组(与简单的操作顺序parens相比)
  • 使用单个字符串格式操作构建fortan命令可能更容易

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

我的建议

我建议查看this stackoverflow thread for ssh而不是使用子流程

答案 1 :(得分:2)

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

然而,你所做的大部分内容听起来都像是在shell脚本中运行良好。为简单起见,您可以在服务器端为服务器端操作创建一个shell脚本,然后在ssh语句中插入路径:

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

答案 2 :(得分:1)

一个错误:
你的args列表中有一个不带引号的%s,所以你的字符串格式化会失败。

答案 3 :(得分:1)

这是一个使用子进程模块通过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_keys。

答案 4 :(得分:1)

您可以使用fabric执行第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

答案 5 :(得分:0)

你必须使用python吗?

ssh user @ host“command”