2014-08-27 2 views
0

Я использую скрипт python в качестве загрузочного устройства, чтобы запустить длинную службу java.Начать процесс без вывода stdout

call = [ "java", "-cp", ... ] 

with open(os.devnull, 'w') as fnull: 
    subprocess.Popen(call, stdout=fnull) 
    print "Service started." 

Но когда процесс python завершился, я все равно получаю вывод stdout из процесса java. Я предполагаю, что это связано с тем, что python закрыл мой fnull, поэтому он возвращается к нормальному стандарту.

Как я могу достичь того, чего хочу?

EDIT: На стороне примечания было бы неплохо получить stderr, если это вообще возможно, но нет, если оно добавит сложности.

EDIT2: Казалось бы, я очень придурок, это было написано stderr.

+1

Вы уверены, что это действительно 'stdout', а не' stderr' вы видите? – FatalError

+2

'stdout' указывает на'/dev/null', вы не можете его видеть. Ваш Java-процесс, вероятно, отправляет сообщения в 'stderr'. –

+0

Как только дочерние процессы вилки, не имеет значения, что происходит с дескриптором родительского файла. Ребенок получает/dev/null. Добавьте свой голос в гипотезу stderr. – tdelaney

ответ

-1

Если вы хорошо с давая сценарий питона живой

Popen.communicate (вход = None)

Взаимодействовать с процессом: Отправить данные для стандартного ввода. Чтение данных из stdout и stderr, пока не будет достигнут конец файла. Подождите, пока процесс завершится. Необязательный входной аргумент должен быть строкой, которая должна быть отправлена ​​дочернему процессу, или Нет, если никакие данные не должны быть отправлены ребенку.

+0

'общаться()' только захватывает stdout и stderr, если они направлены на 'popen.PIPE', что здесь не так. –

0

Частичный ответ на боковое примечание, его легко получить stderr (его сложнее, если вы хотите как stdout, так и stderr). У этого есть дополнительное преимущество, что он скажет вам, является ли выход java, который, по вашему мнению, на stdout, действительно на stderr.

call = [ "java", "-cp", ... ] 

with open(os.devnull, 'w') as fnull: 
    subprocess.Popen(call, stdout=fnull, stderr=subprocess.PIPE) 
    print "Service started." 
for line in stderr: 
    print 'stderr: ', line.strip() 
Смежные вопросы