python – 使用shell时返回subprocess.call()参数= True w / lis
参见英文答案 >
subprocess.call using string vs using list????????????????????????????????????1个
我试图让python的subprocess.call方法通过列表(由一系列字符串组成)接受一些args命令,如python文档中所建议的那样.为了在将它放入我的实际脚本之前探索这种行为,我打开了IPython,运行了一些涉及shell设置和args命令的不同组合的命令,并得到以下行为: In [3]: subprocess.call(['ls','-%sl' %'a']) total 320 drwxr-xr-x 20 Kohaugustine staff 680 Oct 15 16:55 . drwxr-xr-x 5 Kohaugustine staff 170 Sep 12 17:16 .. -rwxr-xr-x 1 Kohaugustine staff 8544 Oct 15 16:55 a.out -rwxr-xr-x 1 Kohaugustine staff 8544 Oct 3 10:28 ex1-6 -rw-r--r--@ 1 Kohaugustine staff 204 Oct 3 10:28 ex1-6.c -rwxr-xr-x 1 Kohaugustine staff 8496 Oct 3 10:15 ex1-7 -rw-r--r--@ 1 Kohaugustine staff 71 Oct 3 10:15 ex1-7.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:22 hello -rw-r--r--@ 1 Kohaugustine staff 58 Sep 12 16:27 hello.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:24 hello.o -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:24 hello_1.o -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:27 hello_2.o -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:27 hello_3.o -rwxr-xr-x 1 Kohaugustine staff 8544 Oct 15 16:55 lesson_1-5 -rw-r--r--@ 1 Kohaugustine staff 185 Sep 28 10:35 lesson_1-5.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 21 10:06 temperature.o -rw-r--r--@ 1 Kohaugustine staff 406 Sep 21 09:54 temperature_ex1-3.c -rw-r--r--@ 1 Kohaugustine staff 582 Sep 21 10:06 temperature_ex1-4.c -rw-r--r--@ 1 Kohaugustine staff 178 Sep 23 17:21 temperature_ex1-5.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 23 17:21 temperature_ex1-5.o Out[3]: 0 In [4]: subprocess.call(['ls','-%sl' %'a'],shell=True) a.out ex1-7 hello.c hello_2.o lesson_1-5.c temperature_ex1-4.c ex1-6 ex1-7.c hello.o hello_3.o temperature.o temperature_ex1-5.c ex1-6.c hello hello_1.o lesson_1-5 temperature_ex1-3.c temperature_ex1-5.o Out[4]: 0 In [6]: subprocess.call(['ls','-al']) total 320 drwxr-xr-x 20 Kohaugustine staff 680 Oct 15 16:55 . drwxr-xr-x 5 Kohaugustine staff 170 Sep 12 17:16 .. -rwxr-xr-x 1 Kohaugustine staff 8544 Oct 15 16:55 a.out -rwxr-xr-x 1 Kohaugustine staff 8544 Oct 3 10:28 ex1-6 -rw-r--r--@ 1 Kohaugustine staff 204 Oct 3 10:28 ex1-6.c -rwxr-xr-x 1 Kohaugustine staff 8496 Oct 3 10:15 ex1-7 -rw-r--r--@ 1 Kohaugustine staff 71 Oct 3 10:15 ex1-7.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:22 hello -rw-r--r--@ 1 Kohaugustine staff 58 Sep 12 16:27 hello.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:24 hello.o -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:24 hello_1.o -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:27 hello_2.o -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 12 16:27 hello_3.o -rwxr-xr-x 1 Kohaugustine staff 8544 Oct 15 16:55 lesson_1-5 -rw-r--r--@ 1 Kohaugustine staff 185 Sep 28 10:35 lesson_1-5.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 21 10:06 temperature.o -rw-r--r--@ 1 Kohaugustine staff 406 Sep 21 09:54 temperature_ex1-3.c -rw-r--r--@ 1 Kohaugustine staff 582 Sep 21 10:06 temperature_ex1-4.c -rw-r--r--@ 1 Kohaugustine staff 178 Sep 23 17:21 temperature_ex1-5.c -rwxr-xr-x 1 Kohaugustine staff 8496 Sep 23 17:21 temperature_ex1-5.o Out[6]: 0 In [7]: subprocess.call(['ls','-al'],shell = True) a.out ex1-7 hello.c hello_2.o lesson_1-5.c temperature_ex1-4.c ex1-6 ex1-7.c hello.o hello_3.o temperature.o temperature_ex1-5.c ex1-6.c hello hello_1.o lesson_1-5 temperature_ex1-3.c temperature_ex1-5.o Out[7]: 0 似乎每当shell = True时,输出似乎与: In [9]: subprocess.call(['ls']) a.out ex1-7 hello.c hello_2.o lesson_1-5.c temperature_ex1-4.c ex1-6 ex1-7.c hello.o hello_3.o temperature.o temperature_ex1-5.c ex1-6.c hello hello_1.o lesson_1-5 temperature_ex1-3.c temperature_ex1-5.o Out[9]: 0 我很困惑;当我设置shell = True时,’-a’选项会发生什么? shell没有读过吗?我已经阅读了文档,并且它说当shell = True时,这意味着我的指定命令将通过shell执行,因此它应该意味着ls -a被送到shell并由shell执行.那么为什么[4]和[7]中的行为呢? 另外,如果我在[3]和[4]中使用格式字符串看起来真的很尴尬,那因为在我的实际脚本中我将使用subprocess.call,我将不得不依赖这些格式要在相应的命令选项中替换的字符串.我无法硬编码某些命令行选项.对于args使用纯字符串也是不可能的,因为在我的脚本中将有一个方法必须对命令执行列表操作.我不知道是否有更好的方法可以解决这个问题,所以如果有人能提出不同的建议,那么真的会有所帮助. 非常感谢你! 解决方法
当shell为True时,第一个参数附加到[“/ bin / sh”,“ – c”].如果该参数是列表,则结果列表为
["/bin/sh","-c","ls","-al"] 也就是说,只有ls,而不是ls -al用作-c选项的参数. -al用作shell本身的第一个参数,而不是ls. 当使用shell = True时,通常只想传递一个字符串并让shell根据shell的正常分词规则将其拆分. # Produces ["/bin/sh","ls -al"] subprocess.call("ls -al",shell=True) 在您的情况下,它看起来不需要使用shell = True. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |