Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python子进程_Python_Ssh_Subprocess - Fatal编程技术网

python子进程

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

我通常在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 "%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命令
    PS-为了可读性,通常最好将长列表分成多行:)

    我的建议
    我建议查看而不是使用子流程,下面是一个使用子流程模块通过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