-2

こんにちは、2.x (2.7) システムでしか機能していないように見える関数があります。しかし、私のプログラムの残りの部分は python 3.4 で書かれています。

ファイルa.py (バージョン 2.7) は、スクリプトを次のように呼び出すことで 2.7 で実行できるスクリプトでした。

import psspy    
openPath='busSystem.raw'
saveToPath='busSystem_out.raw'

#Open a case file
psspy.read(0,openPath)
do some calculation...

#Save to another case file
psspy.rawd_2(0,1,[1,1,1,0,0,0,0],0,saveToPath)

そして、b.pyの python 3.4 から次のコードを呼び出します

import os
os.system('c:\python27\python a.py')

しかし、その後、a.py のスクリプトを次のようなkwargsを持つ関数に変更したいと考えました。

def run(openPath='busSystem.raw',saveToPath='busSystem_out.raw')
    #Open a case file
    psspy.read(0,openPath)
    do some calculation...

    #Save to another case file
    psspy.rawd_2(0,1,[1,1,1,0,0,0,0],0,saveToPath)
    do something more...

だから私は何かをしたい

import os
in = 'busSystem.raw'
out = 'busSystem_out.raw'
os.system('c:\python27\python a.py run(in, out)')
# Or
os.system('c:\python27\python a.py run(openPath=in,saveToPath=out)')

質問は次のとおりです。

  • パラメータを別のスクリプトの関数に送信するにはどうすればよいですか?
  • args と kwargs の両方を使用できますか?

Python 3.4でスクリプトを実行できたかどうかはわかっています。関数を次のようにインポートできたはずです

from a import run
run(in,out)

これに対する私の解決策は、Pythonスクリプト全体を文字列として読み取り、 str.replace('busSystem.raw',in) および str.replace(''busSystem_out.raw',out) を使用して、a_newとして保存することです.py を前述のように実行します。

a.pyのスクリプトは、py2.7を介してのみ通信する Siemens PSS/E 33 と対話しているため、python バージョン 2.7 である必要があります。

4

1 に答える 1

1

関数呼び出しは単一のプロセス内でのみ機能し、通常は単一の言語内でのみ機能します。これで、引数なしで実行できるスクリプトができました。次に、このスクリプトでコマンド ライン引数を処理します。これは、実際には、関数呼び出しやキーワード引数とは何の関係もありません。

Python ドキュメントのArgparse チュートリアルを読む必要があります。コマンド ライン引数の概念に慣れていないように思われるため、コマンド ライン引数の概念を紹介し、組み込みargparseモジュールを使用して引数の解析の難しい部分を実行する例をいくつか示します。

subprocess次に、モジュールについて読む必要があります。よりもうまく機能しますos.system()

または、Python 3 で正しく動作するようにスクリプトを更新することもできます。

テストされていないコード例を次に示します。

既存のスクリプトでa.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('openPath')
parser.add_argument('saveToPath')

args = parser.parse_args()

openPath=args.openPath
saveToPath=args.saveToPath

# ... the rest of the existing script

他のプログラムで:

import subprocess
in_ = 'busSystem.raw'
out = 'busSystem_out.raw'
subprocess.call([r'c:\python27\python', in, out])
于 2016-03-17T17:14:12.957 に答える