Python 2.4 在 Solaris 10 上子进程和 grep 多个文件
Python 2.4 subprocess and grep multiple files on Solaris 10
有人可以通过 Python 2.4 subprocess 方法为 运行 下面的 grep 命令提供正确的语法吗?
# grep -n down /tmp/support/alarms/SS7Alarms.*
/tmp/support/alarms/SS7Alarms.263:8301:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.264:7733:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.264:7737:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.264:12603:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.264:12607:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.265:6523:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.265:6531:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.267:10349:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.270:11159:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.270:13229:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.271:13041:LAES: SS7MGR: Association Id 2 is down
我可以让单个文件工作:
p = subprocess.Popen(["grep", "-n", "down", "/tmp/support/alarms/SS7Alarms.263"], stdout=subprocess.PIPE)
当我尝试 grep 多个文件时它失败了:
p = subprocess.Popen(["grep", "-n", "down", "/tmp/support/alarms/SS7Alarms.*"], shell=True, stdout=subprocess.PIPE)
>>> Usage: grep -hblcnsviw pattern file . . .
没有这样的文件/tmp/support/alarms/SS7Alarms.*
。您必须将每个文件作为单独的参数传递给 grep。 *
在 shell 中工作的唯一原因是 shell 在将它们传递给 grep 之前会将 *
扩展为多个参数。
如果要扩展 glob,请使用 glob
模块:
import glob
p = subprocess.Popen(
["grep", "-n", "down"] + glob.glob("/tmp/support/alarms/SS7Alarms.*"),
stdout=subprocess.PIPE)
您可以只使用 shell=True
作为 Popen
的参数,但这会导致其他问题。
经过几个小时的环顾四周,我放弃了并在 Whosebug 上发帖只是为了弄清楚几分钟的测试。
p = subprocess.Popen('grep -n down /tmp/support/alarms/SS7Alarms.*', shell=True, stdout=subprocess.PIPE)
将完整的命令放入一个字符串中就可以了。
有人可以通过 Python 2.4 subprocess 方法为 运行 下面的 grep 命令提供正确的语法吗?
# grep -n down /tmp/support/alarms/SS7Alarms.*
/tmp/support/alarms/SS7Alarms.263:8301:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.264:7733:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.264:7737:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.264:12603:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.264:12607:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.265:6523:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.265:6531:LAES: SS7MGR: Association Id 1 is down
/tmp/support/alarms/SS7Alarms.267:10349:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.270:11159:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.270:13229:LAES: SS7MGR: Association Id 2 is down
/tmp/support/alarms/SS7Alarms.271:13041:LAES: SS7MGR: Association Id 2 is down
我可以让单个文件工作:
p = subprocess.Popen(["grep", "-n", "down", "/tmp/support/alarms/SS7Alarms.263"], stdout=subprocess.PIPE)
当我尝试 grep 多个文件时它失败了:
p = subprocess.Popen(["grep", "-n", "down", "/tmp/support/alarms/SS7Alarms.*"], shell=True, stdout=subprocess.PIPE)
>>> Usage: grep -hblcnsviw pattern file . . .
没有这样的文件/tmp/support/alarms/SS7Alarms.*
。您必须将每个文件作为单独的参数传递给 grep。 *
在 shell 中工作的唯一原因是 shell 在将它们传递给 grep 之前会将 *
扩展为多个参数。
如果要扩展 glob,请使用 glob
模块:
import glob
p = subprocess.Popen(
["grep", "-n", "down"] + glob.glob("/tmp/support/alarms/SS7Alarms.*"),
stdout=subprocess.PIPE)
您可以只使用 shell=True
作为 Popen
的参数,但这会导致其他问题。
经过几个小时的环顾四周,我放弃了并在 Whosebug 上发帖只是为了弄清楚几分钟的测试。
p = subprocess.Popen('grep -n down /tmp/support/alarms/SS7Alarms.*', shell=True, stdout=subprocess.PIPE)
将完整的命令放入一个字符串中就可以了。