Как я могу запустить функцию 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])