【问题标题】:python sub-processpython子进程
【发布时间】:2010-11-17 01:13:41
【问题描述】:

我通常在 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

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

【问题讨论】:

    标签: python ssh subprocess


    【解决方案1】:

    有一些语法错误...

    原文:

    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 命令可能更容易

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

    我的建议

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          这是一个完整的例子,使用 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。

          【讨论】:

            【解决方案5】:

            您可以在第 1 步和第 2 步中使用 fabric。 这是基本思想:

            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

            【讨论】:

              【解决方案6】:

              一定要用python吗?

              ssh user@host "命令"

              【讨论】:

                猜你喜欢
                • 2014-09-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-05-06
                • 2017-03-23
                • 2011-12-18
                • 2017-05-30
                • 2014-01-07
                相关资源
                最近更新 更多