Как получить значение переменной из подпроцесса и использовать его в другой программе

#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, о котором я упоминал.