gpt4 book ai didi

python - 在 Python 中需要保持 openssl 事件并继续给它命令

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:02 24 4
gpt4 key购买 nike

我尝试过提到的方法 here使用以下实现:

from subprocess import PIPE, Popen

process = Popen(['/usr/bin/openssl', 'enc', '-aes-256-cbc', '-a', '-pass', 'pass:asdf'], stdin=PIPE, stdout=PIPE)
process.stdin.write('Hello this is it')
process.stdin.flush()
print(repr(process.stdout.readline()))

但它卡在 readline() 虽然我已经写入并刷新了。我还尝试了提到的非阻塞方法 here但这也阻止了 readline()。以下是我为后一种方法编写的代码:

import sys
import time
from subprocess import PIPE, Popen
from threading import Thread
from Queue import Queue, Empty

def enqueue_output(out, queue):
for line in iter(out.readline, b''):
queue.put(line)
out.close()

def write_to_stdin(process):
process.stdin.write(b'Hello this is it')

p = Popen(['/usr/bin/openssl', 'enc', '-aes-256-cbc', '-a', '-pass', 'pass:asdf'], stdin=PIPE, stdout=PIPE, bufsize=-1, close_fds=ON_POSIX)
q = Queue()

t2 = Thread(target=write_to_stdin, args=(p,))
t2.daemon = True
t2.start()

t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

try:
line = q.get(timeout=3) # or q.get(timeout=.1)
except Empty:
print('no output yet')
else:
print line

我得到还没有输出作为输出。

唯一可行的方法是使用:

process.communicate

但这会关闭进程,我们必须再次重新打开进程。对于大量消息进行加密,这会花费太多时间,我试图避免包含任何外部包来完成此任务。任何帮助将不胜感激谢谢。

最佳答案

process.stdin.flush() 替换为 process.stdin.close(),如下所示:

from subprocess import PIPE, Popen

process = Popen(['/usr/bin/openssl', 'enc', '-aes-256-cbc', '-a', '-pass', 'pass:asdf'], stdin=PIPE, stdout=PIPE)
process.stdin.write('Hello this is it')
process.stdin.close()
print(repr(process.stdout.readline()))

这个 readline() 不再阻塞。

解释是 openssl enc 一直等到它的标准输入结束,只有当调用进程关闭管道时才会到达。

关于python - 在 Python 中需要保持 openssl 事件并继续给它命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47941281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com