我正在创建一个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}$有人知道为什么我不能让子进程工作吗?在
让我恼火的是,我可以让它为除此之外的任何事情工作(即使我有一个可以接受(但不推荐)的解决方法)。在
在
commands.getoutput()
的情况下使用语法引号,在subprocess.check_output()
的情况下使用文本引号。如果没有shell=True
(您不应该使用它),就没有shell将引号解析为语法,因此就没有语法引号,除了Python本身的语法引号。在所以,去掉你在论点中注入的
"
s:再详细解释一下
当您将
"name"
作为命令的一部分传递给shell时,引号在shell本身的解析过程中被使用,而不是作为参数传递给命令。因此,当您运行sh -c 'echo "hello"'
时,这会将完全相同的参数作为sh -c 'echo hello'
传递给echo
;echo
命令甚至不能区分这两个调用之间的区别!在相反,当您将}(它没有)。在
'"hello"'
作为参数传递给subprocess.Popen()
时,外部引号被Python使用,而内部引号被作为文本传递给内部命令。这使得它等价于sh -c 'echo "\"hello\""'
(它同样将文字引号传递给echo
),而不是{相关问题 更多 >
编程相关推荐