我正在尝试编写一个脚本,我将文件名作为参数从shell脚本传递给python脚本和python脚本进程脚本。
它给了我keyerror但是如果我运行相同的脚本硬编码文件名它工作正常。
#!/bin/sh
LOCKFILE=./test.txt
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
echo "already running"
exit
fi
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}
# do stuff
FILES=/home/sugoi/script/csv/*
for file in $FILES
do
python ./csvTest.py $file
#mv $file ./archive
done
rm -f ${LOCKFILE}
exit
的Python:
from pymongo import MongoClient
import csv
import json
import sys
client = MongoClient()
db = client.test
for arg in sys.argv:
try:
csvfile = open(arg, 'r')#if i hardcode file name here it works fine
except IOError as e:
#write to error log
sys.exit(100)
reader = csv.DictReader(csvfile)
header=reader.next()
for each in reader:
row={}
for field in header:
row[field]=each[field]
db.test.update({"_id": row["CustomerId"]}, {"$push": {"activities":{"action": row["Action"],"date" :row["Timestamp"],"productId":row["productId"]}}},True)
我做错了什么?
答案 0 :(得分:1)
两个问题。
FILES=/home/sugoi/script/csv/*
需要像:
FILES=`ls -1 /home/sugoi/script/csv/*;`
sys.argv
? 只需使用参数本身sys.argv[1]
即可。正如@Brian Besmanoff指出的那样,需要将其编入索引1
,因为脚本名称本身存储在sys.argv[0]
中。
try:
csvfile = open(sys.argv[1], 'r')
except IOError as e:
(...)
最后:您可以使用Python解析目录,而不是在shell脚本中循环。查看os
模块,尤其是os.listdir()
。还有一点工作,你可以在一个Python脚本中运行整个事情,而不是在shell和调用脚本之间进行操作。
答案 1 :(得分:0)
sys.argv
中的第一个值将是脚本的名称。 reference