5

私は通常、次のように 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

上記の 3 つの手順をすべて実行し、発生しているエラーを回避する Python プログラムを作成するにはどうすればよいですか?

4

6 に答える 6

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)
      ]

いくつかのメモ:

  • 要素が 1 つのタプルでは、​​最初の引数の最後にカンマが必要です (workDir,) を参照して、タプルとして解釈されます (対単純な操作順序の括弧)。
  • 単一の文字列フォーマット操作で fortan コマンドを構築する方がおそらく簡単です

PS - 読みやすくするために、長いリストを複数の行に分割することをお勧めします:)

私のアドバイス

サブプロセスを使用する代わりに、ssh のこのスタックオーバーフロー スレッドを参照することをお勧めします。

于 2009-08-05T15:03:35.030 に答える
2

手動部分については、pexpectまたは Windows wexpectを調べることができます。これらにより、サブプロセスを実行し、インタラクティブな条件下で入力を渡すことができます。

ただし、実行していることのほとんどは、シェル スクリプトでうまく機能するように思えます。簡単にするために、サーバー側の操作用にサーバー側でシェル スクリプトを作成し、ssh ステートメントにパスをプラグインすることができます。

ssh user@host "/path/to/script.sh"
于 2009-08-05T14:55:28.850 に答える
1

ステップ 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
于 2012-04-28T14:49:18.850 に答える
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 に追加する必要があることに注意してください。

于 2009-11-26T00:10:40.073 に答える
1

1 つのエラー:
引数のリストに引用符で囲まれていない %s があるため、文字列の書式設定は失敗します。

于 2009-08-05T15:01:13.990 に答える
0

あなたはパイソンを使わなければなりませんか?

ssh user@host "コマンド"

于 2009-08-05T14:54:11.520 に答える