通过子进程在python脚本之间传输腌制的对象输出。

塔潘·钱德拉

我有两个python脚本:object_generator.py,它们使给定的对象腌制并打印。另一个脚本object_consumer.py通过subprocess.communicate选择第一个脚本的输出,并尝试使用pickle.loads对其进行修补。我在使这个简单的方案起作用时遇到了麻烦。这是我的代码:

object_generator.py

import pickle
import base64

o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}
d = pickle.dumps(o)
print(d)

#Various Approaches I had tried, none of which worked. Ignore this part.
#s = base64.b64decode(d)
#encoded_str = str(d).encode('ascii')
#print('encoded str is :')
#print(encoded_str)
#decoded_str = encoded_str.decode('ascii')
#print('decoded str is :')
#print(decoded_str)
#unpickled_obj = pickle.loads(bytes(decoded_str))
#print(unpickled_obj)
#print(type(d))
#print(codecs.decode(d))

object_consumer.py

import pickle
import subprocess
import os

dr = '"' + os.path.dirname(os.path.abspath(__file__)) + '\\object_generator.py"'

cmd = 'python -u ' + dr

proc = subprocess.Popen(cmd,stdout=subprocess.PIPE)

try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

# 'out' at this point is something like this : 
# b"b'\\x80\\x03}q\......x05K\\x03u.'\r\n"
# DO SOMETHING WITH outs to get back the bytes which can then be 
# unpickled using pickle.loads

obj = pickle.loads(outs)
print(obj)

显然,我需要删除尾随的\ r \ n,这很容易,但是接下来应该做什么?

损伤

这里有几个问题。首先,您要在中打印bytes对象object_generator.py在Python 3.x中,这将导致str(obj)被调用,即被b'yourbyteshere'打印。您不希望开头b'或结尾'要解决此问题,您需要将bytes对象编码为字符串。pickle使用'latin-1'编码,因此我们可以使用编码将bytes对象解码str另一个问题是Windows默认使用的编码sys.stdout实际上并不支持打印解码的pickle字符串。因此,我们需要将sys.stdout*的默认编码更改'latin-1',以便该字符串将使用正确的编码使其成为父进程。

import pickle
import base64
import codecs

o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}
d = pickle.dumps(o)
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='latin-1')
print(d.decode('latin-1'), end='', flush=True)  # end='' will remove that extra \r\n

进行那些更改,它应该可以正常工作。

编辑:

另一个选择是将PYTHONIOENCODING环境变量设置'latin-1'来自父进程:

env = os.environ.copy()
env['PYTHONIOENCODING'] = 'latin-1'
proc = subprocess.Popen(['python3', 'async2.py'] ,stdout=subprocess.PIPE, env=env)

*有关更改Python 3中编码的更多信息,请参见此问题sys.stdout此处提到了我在此处显示的两种方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过子进程在python脚本之间传输腌制的对象输出。

来自分类Dev

通过子进程运行Python脚本失败

来自分类Dev

TypeError:无法腌制Webpy和子进程的文件对象

来自分类Dev

Python:将 python 脚本作为子进程运行并获取输出

来自分类Dev

通过子进程中的python脚本传递UTF-8

来自分类Dev

通过Python子进程的Popen通过外部命令流式传输内存中的数据

来自分类Dev

Python获取子进程的输出

来自分类Dev

捕获python子进程的输出

来自分类Dev

Python获取子进程的输出

来自分类Dev

捕获python子进程的输出

来自分类Dev

如何在不破坏主脚本的情况下用Ctrl + C停止子进程并将子输出流传输到PowerShell中的主脚本?

来自分类Dev

我可以通过管道传输已启动进程的输出吗?

来自分类Dev

通过python中的名称从腌制文件中还原对象

来自分类Dev

使用子进程通过awk在python脚本中通过awk实现填充和舍入值

来自分类Dev

如何在python脚本和子进程之间切换pid?

来自分类Dev

从Python脚本子进程获取输出

来自分类Dev

从Python脚本子进程获取输出

来自分类Dev

使用 Python 的子进程读取通过 stdin 发送的阻塞命令的输出

来自分类Dev

没有\ n的python子进程输出

来自分类Dev

复制来自Python子进程的终端输出

来自分类Dev

Python子进程/ Popen标准输出被截断

来自分类Dev

如何从Python子进程收集输出

来自分类Dev

如何从python子进程检索输出

来自分类Dev

Python子进程/ Popen标准输出被截断

来自分类Dev

检查子进程python3的输出

来自分类Dev

如何通过子进程在NodeJS和Python(pynput)之间进行通信

来自分类Dev

调用Python脚本作为子进程

来自分类Dev

python中无法腌制的多进程任务?

来自分类Dev

脚本结束后,Python Windows脚本子进程继续输出

Related 相关文章

  1. 1

    通过子进程在python脚本之间传输腌制的对象输出。

  2. 2

    通过子进程运行Python脚本失败

  3. 3

    TypeError:无法腌制Webpy和子进程的文件对象

  4. 4

    Python:将 python 脚本作为子进程运行并获取输出

  5. 5

    通过子进程中的python脚本传递UTF-8

  6. 6

    通过Python子进程的Popen通过外部命令流式传输内存中的数据

  7. 7

    Python获取子进程的输出

  8. 8

    捕获python子进程的输出

  9. 9

    Python获取子进程的输出

  10. 10

    捕获python子进程的输出

  11. 11

    如何在不破坏主脚本的情况下用Ctrl + C停止子进程并将子输出流传输到PowerShell中的主脚本?

  12. 12

    我可以通过管道传输已启动进程的输出吗?

  13. 13

    通过python中的名称从腌制文件中还原对象

  14. 14

    使用子进程通过awk在python脚本中通过awk实现填充和舍入值

  15. 15

    如何在python脚本和子进程之间切换pid?

  16. 16

    从Python脚本子进程获取输出

  17. 17

    从Python脚本子进程获取输出

  18. 18

    使用 Python 的子进程读取通过 stdin 发送的阻塞命令的输出

  19. 19

    没有\ n的python子进程输出

  20. 20

    复制来自Python子进程的终端输出

  21. 21

    Python子进程/ Popen标准输出被截断

  22. 22

    如何从Python子进程收集输出

  23. 23

    如何从python子进程检索输出

  24. 24

    Python子进程/ Popen标准输出被截断

  25. 25

    检查子进程python3的输出

  26. 26

    如何通过子进程在NodeJS和Python(pynput)之间进行通信

  27. 27

    调用Python脚本作为子进程

  28. 28

    python中无法腌制的多进程任务?

  29. 29

    脚本结束后,Python Windows脚本子进程继续输出

热门标签

归档