在参数中运行带引号的命令可以与命令.getoutput()但不是子流程modu

2024-04-20 06:17:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个python程序,它调用许多其他程序和脚本(在Unix(SUNos)+Linux上)。除了一个脚本之外,我到处都在使用子进程。在

我不使用子进程的脚本是一个perl脚本,它已经被制作成可执行文件。不知何故,它不允许我在上使用subprocess,但它可以与(不推荐使用的)commands包一起使用。 我想了解它为什么不能与子流程一起工作(换句话说:我做错了什么;—)

(实际的perl命令并不重要,但它会返回用户的全名和电子邮件)

我尝试了:

PERL_CMD = [ '<executable perl-script>', '-rt', '"users"', '-eq', '"name"' '"<user_name>", '-fs', '":"', '-fld', '"fullname"', '"email"' ]
full_name, email = subprocess.check_output( PERL_CMD ).split(':')

但这行不通。在

命令变量的作用是:

^{pr2}$

有人知道为什么我不能让子进程工作吗?在

让我恼火的是,我可以让它为除此之外的任何事情工作(即使我有一个可以接受(但不推荐)的解决方法)。在


Tags: name命令程序脚本cmd可执行文件进程email
1条回答
网友
1楼 · 发布于 2024-04-20 06:17:09

commands.getoutput()的情况下使用语法引号,在subprocess.check_output()的情况下使用文本引号。如果没有shell=True(您不应该使用它),就没有shell将引号解析为语法,因此就没有语法引号,除了Python本身的语法引号。在

所以,去掉你在论点中注入的"s:

# this contains quotes that are syntactic to Python only, and no literal quotes
perl_cmd = [
  '<executable perl-script>',
  '-rt', 'users',
  '-eq', 'name', '<user_name>',
  '-fs', ':',
  '-fld', 'fullname', 'email' ]

再详细解释一下

当您将"name"作为命令的一部分传递给shell时,引号在shell本身的解析过程中被使用,而不是作为参数传递给命令。因此,当您运行sh -c 'echo "hello"'时,这会将完全相同的参数作为sh -c 'echo hello'传递给echoecho命令甚至不能区分这两个调用之间的区别!在

相反,当您将'"hello"'作为参数传递给subprocess.Popen()时,外部引号被Python使用,而内部引号被作为文本传递给内部命令。这使得它等价于sh -c 'echo "\"hello\""'(它同样将文字引号传递给echo),而不是{}(它没有)。在

相关问题 更多 >