我的目标是比较两个数据,一个来自文本文件,一个来自目录,比较后,这将通知或显示在控制台中找不到的数据,例如:
ls: /var/patchbundle/rpms/:squid-2.6.STABLE21-7.el5_10.x86_64.rpm NOT FOUND!
ls: /var/patchbundle/rpms/:tzdata-2014j-1.el5.x86_64.rpm
ls: /var/patchbundle/rpms/:tzdata-java-2014j-1.el5.x86_64.rpm
ls: /var/patchbundle/rpms/:wireshark-1.0.15-7.el5_11.x86_64.rpm
ls: /var/patchbundle/rpms/:wireshark-gnome-1.0.15-7.el5_11.x86_64.rpm
ls: /var/patchbundle/rpms/:yum-updatesd-0.9-6.el5_10.noarch.rpm NOT FOUND
一定是这样的。所以这是我的python代码。
import package, sys, os, subprocess
path = '/var/tools/tools/newrpms.txt'
newrpms = open(path, "r")
fds = newrpms.readline()
def checkrc(rc):
if(rc != 0):
sys.exit(rc)
cmd = package.Errata()
for i in newrpms:
rc = cmd.execute("ls /var/patchbundle/rpms/ | grep %newrpms ")
if ( != 0):
cmd.logprint ("%s not found !" % i)
checkrc(rc)
sys.exit(0)
newrpms.close
请参阅shell脚本。这个脚本是它的执行文件,但是因为我想使用另一种语言,这就是我尝试python的原因
retval=0
for i in $(cat /var/tools/tools/newrpms.txt)
do
ls /var/patchbundle/rpms/ | grep $i
if [ $? != 0 ]
then
echo "$i NOT FOUND!"
retval=255
fi
done
exit $retval
请参阅我的Python代码。有什么问题,因为它没有像执行它的shell一样执行。
答案 0 :(得分:1)
你不能说出" newrpms.txt"的内容。是;你说剧本没有按照你想要的方式执行 - 但你不能说它在做什么;我不知道package
或package.Errata
是什么,所以我在猜这个问题;但很多事情都是错的。
if ( != 0):
是语法错误。如果{empty space}不等于零?
cmd.execute("ls /var/patchbundle/rpms/ | grep %newrpms ")
可能没有做你想要的。你不能像Python一样把变量放在Python的字符串中,如果你能newrpms
是文件句柄而不是当前行。那应该是...grep %s" % (i,))
?
控制流程正在执行:
newrpms.close
没有做任何事情,需要newrpms.close()
来调用close方法。
您正在编写shell-script-in-Python。怎么样:
import os, sys
retval=0
for line in open('/var/tools/tools/newrpms.txt'):
rpm_path = '/var/patchbundle/rpms/' + line.strip()
if not os.path.exists(rpm_path):
print rpm_path, "NOT FOUND"
retval = 255
else:
print rpm_path
sys.exit(retval)
略微编辑代码,并解释:
代码几乎是shell脚本到Python的直接副本。它循环遍历文本文件中的每一行,并调用line.strip()
以删除最后的换行符。它构建rpm_path
,类似于" / var / patchbundle / rpms /:tzdata-2014j-1.el5.x86_64.rpm"。
然后它使用sys.path.exists()
测试文件是否存在,如果不存在则返回True,如果不存在则返回False,并使用该测试设置错误值并打印结果,如shell脚本打印它们。这取代了" ls ... | grep"用于检查文件是否存在的部分代码。