Как я могу запустить функцию Python 2.x из 3.x, построенного с аргументами? PSS/E

Привет у меня есть функция, которая выглядит так, как будто она работает только в системе 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)

И затем вызов следующего кода из Python 3.4 в b.py работает

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

Итак, вопрос:

  • как я могу отправить параметры в функцию другого скрипта?
  • я могу использовать и арг и кваргс?

Я знаю, если бы я мог запустить скрипт с 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 ответ

Вызовы функций работают только в рамках одного процесса и, как правило, только в пределах одного языка. Итак, у вас есть скрипт, который можно запустить без аргументов. Теперь вы хотите, чтобы этот скрипт обрабатывал аргументы командной строки. На самом деле это не имеет ничего общего с вызовами функций и аргументами ключевых слов.

Вы должны прочитать руководство по Argparse в документации по Python. Он вводит концепцию аргументов командной строки, так как вы, кажется, не знакомы с ней, а затем показывает некоторые примеры использования встроенного 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])
Другие вопросы по тегам