Запуск внешней программы с использованием каналов и передача аргументов в python - PullRequest
1 голос
/ 10 августа 2011

Я пытался это сделать, но когда я пытаюсь вывести эти аргументы, он не возвращает значений. Я отправляю мой код ниже:

script1, который запускает внешнюю программу на python (script2)

#(...)
proc = subprocess.Popen(['export PYTHONPATH=~/:$PYTHONPATH;' +
    'export environment=/path/to/environment/;' +
    'python /path/to/my/program/myProgram.py',
    '%(date)s' %{'date':date}, '%(time)s' %{'time':time}],
    stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)
#(...)

script2, который запускается script1

#(...)
print sys.argv[0] #prints the name of the command
print sys.argv[1] #it suppose to print the value of the first argument, but it doesn't
print sys.argv[2] #it suppose to print the value of the second argument, but it doesn't
#(...)

Ответы [ 3 ]

1 голос
/ 10 августа 2011

Документы говорят, что при указании shell = True любые дополнительные аргументы обрабатываются как аргументы для оболочки, а не для команды. Чтобы это работало, просто установите shell в False. Я не понимаю, почему вам нужно, чтобы это было Истиной.

edit: я вижу, вы хотите использовать shell для установки переменных окружения. Вместо этого используйте аргумент env для установки переменных окружения.

1 голос
/ 10 августа 2011
  1. Используйте параметр Popen env для передачи переменных окружения:
  2. Не используйте shell=True, если нет необходимости. Это может быть безопасность риск (см. Предупреждение) .

test.py:

import subprocess
import shlex
import datetime as dt
now=dt.datetime.now()
date=now.date()
time=now.strftime('%X')

proc = subprocess.Popen(shlex.split(
    'python /tmp/test2.py %(date)s %(time)s'%{'date':date,
                                         'time':time}),
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                        env={'PYTHONPATH':'~/:$PYTHONPATH',
                             'environment':'/path/to/environment/'})

out,err=proc.communicate()
print(out)
print(err)

test2.py:

import sys
import os

print(os.environ['PYTHONPATH'])
print(os.environ['environment'])
for i in range(3):
    print(sys.argv[i])

выходы

~/:$PYTHONPATH
/path/to/environment/
/tmp/test2.py
2011-08-09
17:50:04
1 голос
/ 10 августа 2011

Попробуйте эту версию скрипта 1:

proc = subprocess.Popen('python /path/to/my/program/myProgram.py %s %s' % (date, time),
                        stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True,  
                        env = {'PYTHONPATH': '~/:$PYTHONPATH',
                               'environment': '/path/to/environment/'})

Это должно облегчить поиск вашей проблемы, если она не работает; но я думаю, что так и будет.

...