-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中的脚本需要在python 2.7版本,因为它与西门子PSS/E 33交互,它只通过py2.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 回答