Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess stdin=subprocess.PIPE和unicode_Python_Unicode_Utf 8_Subprocess - Fatal编程技术网

Python subprocess stdin=subprocess.PIPE和unicode

Python subprocess stdin=subprocess.PIPE和unicode,python,unicode,utf-8,subprocess,Python,Unicode,Utf 8,Subprocess,好的,一点背景故事。我正在为我的应用程序编写备份和恢复功能。我想允许备份文件的加密密码允许任何unicode字符。然后,我不得不使用subprocess来实际运行backup命令,该命令可以通过以下方式正常工作: cmd = ['sudo', CMD_SCRIPT, 'python', script, 'backup', password, backup_to] subprocess.check_call(cmd) 我已经能够解密文件使用相同的unicode密码,它似乎工作得很好 我的

好的,一点背景故事。我正在为我的应用程序编写备份和恢复功能。我想允许备份文件的加密密码允许任何unicode字符。然后,我不得不使用subprocess来实际运行backup命令,该命令可以通过以下方式正常工作:

cmd = ['sudo', CMD_SCRIPT, 'python', script, 'backup', password, backup_to]    
subprocess.check_call(cmd)
我已经能够解密文件使用相同的unicode密码,它似乎工作得很好

我的问题出现在恢复阶段;由于恢复过程会关闭用于与客户交互的服务器,因此我需要在单独的deamon中启动此过程。我完成此任务的代码如下所示:

cmd = ['python', script, 'restore', password, backup_file, 'user']
proc = subprocess.Popen(['at', 'now'], stdin=subprocess.PIPE)
proc.communicate(' '.join(cmd))
cmd = [u'python', script, u'restore', password, backup_file, u'user']
proc = subprocess.Popen(['at', 'now'], stdin=subprocess.PIPE)
proc.communicate(u' '.join(cmd).encode('utf-8'))
当subprocess.PIPE尝试写入此代码块时(不是我的代码块,可在subprocess.communicate中找到):

我尝试过设置proc.stdin.encoding='utf-8',但它告诉我该属性是只读的,我还尝试过在初始化Popen实例时设置env={'pythonionencoding':'utf-8'}。这两件事都不管用


是否有另一个stdin对象允许我定义编码?请帮忙。

好的。。。我现在将停止子进程上的lynch mob。在Python2中混用unicode和str类型时粗心大意,这完全是我的错

将列表传递给check_call()命令时,似乎有一些功能可以在向操作系统发出命令之前对所有unicode编码。当使用communicate()时,它需要一个字符串,但在列表中将unicode和str类型的混合传递给str类型。连接操作依赖于Python的“有用”组合操作,默认使用“ascii”作为编解码器进行编码和解码当我更改代码以确保列表中的所有内容都是unicode时,然后在传递代码时对其进行编码,以实现预期效果。在确保脚本、密码和备份文件变量为unicode类型后,我的代码现在看起来像:

cmd = ['python', script, 'restore', password, backup_file, 'user']
proc = subprocess.Popen(['at', 'now'], stdin=subprocess.PIPE)
proc.communicate(' '.join(cmd))
cmd = [u'python', script, u'restore', password, backup_file, u'user']
proc = subprocess.Popen(['at', 'now'], stdin=subprocess.PIPE)
proc.communicate(u' '.join(cmd).encode('utf-8'))

请注意我的字符串的“u”前缀,然后当我传递字符串进行通信时,我可以将自己的编码定义为utf-8。

使用
nohup
在后台运行一些东西,而不会将其杀死。