如何从带参数构建的3.x运行python 2.x函数? PSS / E

时间:2016-03-17 16:21:01

标签: python python-2.7 python-3.4 psse

您好,我的功能看起来只适用于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 中的脚本需要在python版本2.7中,因为它与Siemens PSS / E 33交互,后者只通过py2.7进行通信。

1 个答案:

答案 0 :(得分:1)

函数调用仅在单个进程中起作用,通常只在单一语言中起作用。所以你有一个可以不带参数运行的脚本。现在您希望此脚本处理命令行参数。这与函数调用和关键字参数没有任何关系。

您应该阅读Python文档中的Argparse Tutorial。它引入了命令行参数的概念,因为您似乎不熟悉它,然后展示了使用内置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])