подпроцесс Python - PullRequest
       10

подпроцесс Python

5 голосов
/ 05 августа 2009

Я обычно выполняю файл Фортрана в Linux (вручную) как:

  1. Подключиться к серверу
  2. Перейти к определенной папке
  3. ifort xxx.for -o xxx && ./xxx (где «xxx.for» - мой файл на Fortran, а «xxx» - исполняемый файл на Fortran)

Но мне нужно вызвать мой файл fortran (xxx.for) из python (я новичок), поэтому я использовал 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 шага, описанных выше, и избегает ошибки, которую я получаю?

Ответы [ 6 ]

3 голосов
/ 05 августа 2009

есть некоторые синтаксические ошибки ...

оригинал:

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 вместо использования подпроцесса

2 голосов
/ 05 августа 2009

Для ручной части вы можете посмотреть pexpect или для windows wexpect . Это позволяет вам выполнять подпроцессы и передавать ввод в интерактивных условиях.

Однако большая часть того, что вы делаете, звучит так, как будто это хорошо работает в сценарии оболочки. Для простоты вы можете создать сценарий оболочки на стороне сервера для операций на стороне сервера, а затем подключить путь в инструкции ssh:

ssh user@host "/path/to/script.sh"
1 голос
/ 28 апреля 2012

Вы можете использовать ткань для шагов 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
1 голос
/ 26 ноября 2009

Вот полный пример использования модуля подпроцесса для запуска удаленной команды через 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 на удаленном компьютере.

1 голос
/ 05 августа 2009

одна ошибка:
в вашем списке аргументов есть% s без кавычек, поэтому форматирование строки завершится неудачей.

0 голосов
/ 05 августа 2009

Вы должны использовать Python?

ssh user @ host "command"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...