#python #python-3.x #subprocess
#python #python-3.x #подпроцесс
Вопрос:
Вопрос
Я запускаю код python — main.py — в котором я вызываю подпроцесс — subprocess.py , с аргументами командной строки. Я хочу иметь доступ к переменной, возвращаемой в конце subprocess.py в main.py .
Мои коды:
sub.py
import optparse
#ANSI escape sequence
BOLD = "33[1m"
RED = "33[1;31m"
END = "33[0m"
def parser():
parser = optparse.OptionParser()
parser.add_option(
"-n", help="Enter a number: ", dest='n')
(options, args) = parser.parse_args()
n = options.n
return n
def main():
n = parser()
print(BOLD RED f'Your number is {n}' END)
z = int(n)**2
return z
if __name__ == "__main__":
z = main()
main.py
import subprocess
subprocess.run('python /home/username/sub.py -n 2', shell=True) #This one just runs sub.py on the terminal with the ANSI escape sequence but does not return the variable z.
output = subprocess.check_output('python /home/username/sub.py -n 2', shell=True)
print(output) #This one runs sub.py but just dumps the output in the terminal without the ANSI escape sequence and does not return the variable z.
Я хочу иметь возможность запускать sub.py с помощью управляющей последовательности ANSI в терминале из main.py и затем иметь возможность использовать переменную z в main.py . Кроме того, есть ли лучший способ сделать эти две вещи, кроме подпроцесса? Любая помощь / вводные будут оценены. Спасибо.
Мое решение: я решил это, сначала создав функцию (for_sub(n)) в main.py который принимает n в качестве входных данных, а не от анализатора. Затем я вызвал функцию синтаксического анализа (parser()) в main.py и передал значение n в for_sub(n).
sub.py
import optparse
#ANSI escape sequence
BOLD = "33[1m"
RED = "33[1;31m"
END = "33[0m"
def parser():
parser = optparse.OptionParser()
parser.add_option(
"-n", help="Enter a number: ", dest='n')
(options, args) = parser.parse_args()
n = options.n
return n
def for_main(n):
print(BOLD RED f'Your number is {n}' END)
z = int(n)**2
return z
def main():
n = parser()
print(BOLD RED f'Your number is {n}' END)
z = int(n)**2
return z
if __name__ == "__main__":
main()
main.py
import sub import parser
from sub import for_main
import optparse
#ANSI escape sequence
BOLD = "33[1m"
RED = "33[1;31m"
END = "33[0m"
def main():
n = parser()
z = for_main(n)
if __name__ == "__main__":
main()
Комментарии:
1. По какой-либо причине вы не можете импортировать subprocess.py и назовите это основным из вашей программы?
2. Подпроцессы возвращают значения не так, как вы предполагаете. Единственный вывод, который они могут предоставить, ограничен stdout / stderr и кодом возврата (если вы не используете более сложные стратегии IPC ). Этот случай, похоже, не очень подходит для подпроцесса в первую очередь. Я рекомендую вместо этого создавать модули python, как предлагает @saquintes.
3. лучше
import subprocess
и запуститьsys.argv.extend( ['-n', '2'] ) ; z = subprocess.main()
. Вы даже можете отредактироватьsubprocess.py
его для запуска какmain(parser())
, чтобы позже вы могли запустить его какsubprocess.main(2)
4. @saquintes Нет конкретной причины не использовать модули. Я просто хотел изучить возможности. В конце концов, я сделал это с помощью модулей. Большое вам спасибо
5. @NealTitusThomas: Понял. Если по какой-то причине вам нужно, чтобы они были в отдельных процессах, тогда вы хотели бы рассмотреть возможность использования библиотеки многопроцессорной обработки, а также библиотеки с общей памятью в стандартной библиотеке. Или вы можете использовать pickle для передачи объектов / значений python между процессами. Или, если это просто целое число, вы могли бы сделать его частью вывода. Но если в другом процессе, программы python не имеют возможности доступа к другим переменным скрипта за пределами материала SharedMemory, о котором я упоминал.