Как передать значение в аргумент метода, который находится внутри Popen.subprocess? - PullRequest
0 голосов
/ 24 сентября 2018

Это мой основной скрипт на python:

import time
import subprocess
def main():
   while(True):
       a=input("Please enter parameter to pass to subprocess:")
       subprocess.Popen(args="python child.py")
       print(f"{a} was started")
       time.sleep(5)
if __name__ == '__main__':
    main()

Это дочерний скрипт на python с именем child.py:

def main(a):
    while(True):
        print(a)

if __name__ == '__main__':
    main(a)

Как передать значение в аргумент a, находящийся в дочернем элементеподпроцесс?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Вы можете использовать subprocess.PIPE для передачи данных между вашим основным процессом и порожденным подпроцессом.

Основной сценарий:

import subprocess


def main():
    for idx in range(3):
        a = input(
            'Please enter parameter to pass to subprocess ({}/{}): '
            .format(idx + 1, 3))
        print('Child in progress...')
        pipe = subprocess.Popen(
            args='python child.py',
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE)
        pipe.stdin.write(str(a).encode('UTF-8'))
        pipe.stdin.close()
        print('Child output is:')
        print(pipe.stdout.read().decode('UTF-8'))


if __name__ == '__main__':
    main()

Дочерний сценарий:

import sys
import time


def main(a):
    for dummy in range(3):
        time.sleep(.1)
        print(a)


if __name__ == '__main__':
    a = sys.stdin.read()
    main(a)

Выход:

>>> python main.py
Please enter parameter to pass to subprocess (1/3): qwe
Child in progress...
Child output is:
qwe
qwe
qwe

Please enter parameter to pass to subprocess (2/3): qweqwe
Child in progress...
Child output is:
qweqwe
qweqwe
qweqwe

Please enter parameter to pass to subprocess (3/3): 123
Child in progress...
Child output is:
123
123
123
0 голосов
/ 24 сентября 2018

Самый простой способ передать аргументы дочернему процессу - это использовать параметры командной строки .

Первый шаг - переписать child.py, чтобы он принимал аргументы командной строки.В этом вопросе содержится подробная информация об анализе аргументов командной строки: Как читать / обрабатывать аргументы командной строки? В этом простом примере мы просто получим доступ к аргументам командной строки через sys.argv.

import sys

def main(a):
    while(True):
        print(a)

if __name__ == '__main__':
    # the first element in the sys.argv list is the name of our program ("child.py"), so
    # the argument the parent process sends to the child process will be the 2nd element
    a = sys.argv[1]
    main(a)

Теперь child.py можно запустить с аргументом, подобным python child.py foobar, а текст "foobar" будет использоваться в качестве значения для переменной a.

После всего этого остается только переписать parent.py и заставить передать аргумент child.py.Рекомендуемый способ передачи аргументов с subprocess.Popen - это список строк, поэтому мы сделаем именно это:

import time
import subprocess

def main():
   while(True):
       a = input("Please enter parameter to pass to subprocess:")
       subprocess.Popen(["python", "child.py", a])  # pass a as an argument
       print(f"{a} was started")
       time.sleep(5)

if __name__ == '__main__':
    main()
0 голосов
/ 24 сентября 2018

Вам необходимо использовать аргументы командной строки, например:

import time
import subprocess

def main():
   while(True):
       a=input("Please enter parameter to pass to subprocess:")
       subprocess.Popen(["python", "child.py", a])
       print(f"{a} was started")
       time.sleep(5)

if __name__ == '__main__':
    main()

child.py:

import sys

def main(a):
    while(True):
        print(a)

if __name__ == '__main__':
    a = sys.argv[1]
    main(a)
...