python popen Объект Thread read stdout для переменной [duplicate]

Как упоминал Эрик Венделин, вы можете сделать что-то вроде этого:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

Это дает "regex matching .". Однако он будет терпеть неудачу, если str1 - ".". Вы ожидаете, что результат будет "pattern matching regex", заменив период на "regex", но он окажется ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Это потому, что, хотя "." a String, в конструкторе RegExp он по-прежнему интерпретируется как регулярное выражение, что означает любой символ нестрочного разрыва, означающий каждый символ в строке. Для этой цели может быть полезной следующая функция:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

. Тогда вы можете сделать:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

, уступая "pattern matching regex".

2
задан Ali_G 20 April 2017 в 14:04
поделиться

2 ответа

Если вы не можете использовать timeout по какой-либо причине (одна из которых является слишком старой версией python), вот мое решение, которое работает с любой версией python:

  • создает поток, который сначала ждет затем убивает объект subprocess
  • в основном потоке, читает строки в цикле.

Я использую подпроцесс python, работающий с -u (небуферизованный):

передатчик.py: (тестовая программа, которая печатает «hello xx» каждую 1/10-ю секунду)

import time

i=0
while True:
    print("hello {}".format(i))
    i += 1
    time.sleep(0.1)

самой программы (тайм-аут установлен на 1,5 секунды):

import subprocess,threading,time

def timeout(p,timeout):
    time.sleep(timeout)
    p.kill()

p = subprocess.Popen(["python","-u","transmitter.py"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
t = threading.Thread(target=timeout,args=(p,1.5))
t.start()
output = []
for line in p.stdout:
    output.append(line.decode())

t.join()
print("".join(output))

В конце, после таймаута, программа печатает:

hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
hello 10
hello 11
hello 12
hello 13
hello 14
1
ответ дан Jean-François Fabre 19 August 2018 в 06:21
поделиться

Вам нужно использовать Popen и subprocess.PIPE , чтобы поймать выход процесса, когда истекает время ожидания. В частности, Popen.communicate - это то, что вам нужно. Вот пример

proc = subprocess.Popen(["ping", "192.168.1.1"],
                        stdout=subprocess.PIPE)

try:
    output, error = proc.communicate(timeout=2)
except subprocess.TimeoutExpired:
    proc.kill()
    output, error = proc.communicate()
    print(output)
    print(error)

. Это будет печатать выход процесса до истечения времени ожидания.

3
ответ дан Leonardo Chirivì 19 August 2018 в 06:21
поделиться
  • 1
    Thnx для ответа @Leonardo. Я попробовал, но он просто печатает команду, а не вывод этого процесса: «Команда» [..., ...] »истекает через 4 секунды». (точно так же, как вторая строка вывода в вашем примере). Я хотел бы напечатать выход подпроцесса в момент его завершения. – Ali_G 20 April 2017 в 14:22
  • 2
    @Ali_G Я нашел решение, пожалуйста, дайте мне знать. – Leonardo Chirivì 21 April 2017 в 08:45
  • 3
    Это не работает для меня ни ... Я думаю, проблема в том, что упоминается @ J.F. Себастьян в некоторых других сообщениях (т. Е. ссылка ). Thnx в любом случае! – Ali_G 21 April 2017 в 14:42
Другие вопросы по тегам:

Похожие вопросы: