Python子进程和bash/bin/sh:2:语法错误:未终止的引号字符串

Python子进程和bash/bin/sh:2:语法错误:未终止的引号字符串,python,bash,Python,Bash,我试图巧妙地编写一个二进制文件,可以运行该文件生成已安装Python模块版本的格式化列表。以下是令人困惑的输出: 没有 bin/sh:2:语法错误:未终止的引号字符串您的问题是\x27是一个单引号字符,python解释器会对其进行解释,从而导致单引号字符串提前终止。尝试添加额外的转义,例如: #!/usr/bin/python import subprocess import pip installed_packages = pip.get_installed_distributions() i

我试图巧妙地编写一个二进制文件,可以运行该文件生成已安装Python模块版本的格式化列表。以下是令人困惑的输出:

没有


bin/sh:2:语法错误:未终止的引号字符串

您的问题是\x27是一个单引号字符,python解释器会对其进行解释,从而导致单引号字符串提前终止。尝试添加额外的转义,例如:

#!/usr/bin/python
import subprocess
import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
    for i in installed_packages])
comms=''.join(installed_packages_list)
filter="sed 's/\,/\n/g' | tr -d '[] ' | sed 's/\x27//g'"
p = subprocess.Popen([filter], stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
vtime = p.stdin.write(comms)
print(vtime)

既然要将shell=True传递给subprocess.Popen,为什么需要在列表中传递筛选器?为什么要将shell用于基本的字符串操作?1_CR,我正在尝试避免Popen的格式错误。jordanm,问得好,我知道Python完全可以咀嚼和吐出文本。我想这更像是一个理论问题。另外,我肯定有XY问题。打印'\n'.joininstalled\u packages\u列表是否足以满足您的需要?您不能在shell中的单引号内转义单引号。因此,它应该看起来更像:“s/'\\'//g”。实际上,它是双引号中的单引号。在提交答案之前,我测试了我的代码——我相信它能像发布的一样工作。
filter="sed 's/\,/\n/g' | tr -d '[] ' | sed 's/\\\'//g'"