簡體   English   中英

python子進程

[英]python sub-process

我通常在Linux(手動)中執行Fortran文件:

  1. 連接到服務器
  2. 轉到特定文件夾
  3. ifort xxx.for -o xxx && ./xxx (其中'xxx.for'是我的Fortran文件,'xxx'是Fortran可執行文件)

但我需要調用蟒蛇(我是初學者)我的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程序並避免我得到的錯誤?

有一些語法錯誤......

原版的:

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 - 為了便於閱讀,將長列表分成多行通常是個好主意:)

我的建議

我建議查看此stackoverflow線程的ssh而不是使用子進程

對於手動部分,您可能需要查看pexpect或windows wexpect 這些允許您在交互條件下執行子進程並傳遞輸入。

但是,你所做的大部分內容聽起來都像是在shell腳本中運行良好。 為簡單起見,您可以在服務器端為服務器端操作創建一個shell腳本,然后插入ssh語句中的路徑:

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

你可以使用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

一個錯誤:
你的args列表中有一個不帶引號的%s,因此你的字符串格式化會失敗。

下面是一個使用子進程模塊通過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。

你必須使用python嗎?

ssh user @ host“command”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM