如何运行和循环bash脚本命令表单Python脚本

时间:2018-01-09 04:00:34

标签: python mongoimport

我有几个.json文件。我计划使用以下命令将这些文件导入MongoDB:

mongoimport -h HOSTNAME -d DATABASE -c COLLECTION -u USERNAME -p PASSWORD --file FILENAME  --jsonArray

但我不想为每个文件做同样的事情。所以我写了这个Python代码。

import subprocess
import os
import glob

path = ''
for infile in glob.glob(os.path.join(path, '*.json')):
    print "currently uploading: " + infile
    p = subprocess.Popen('mongoimport -h HOSTNAME -d DATABASE -c COLLECTION -u USERNAME -p PASSWORD --file infile  --jsonArray', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    for line in p.stdout.readlines():
            print line,
    retval = p.wait()

在这个程序上,infile是一个参数,它在循环时为mongoimport命令提供一个新的JSON文件但是我无法在循环中传递该文件名而我无法使用{{1} } print infile命令。

有人可以让我知道我应该做什么吗?

1 个答案:

答案 0 :(得分:1)

您通常希望将子进程的参数放在列表中,否则您的实现可能会查找名称为完整字符串(docs)的文件:

subprocess.Popen(['mongoimport', '-h', 'HOSTNAME', '-d', 'DATABASE',
                  '-c', 'COLLECTION', '-u', 'USERNAME', '-p', 'PASSWORD',
                  '--file', infile, '--jsonArray'],
                 stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

请注意infile周围缺少引号来传递参数。

或者,您可以直接在bash中执行此操作。

for input in *.json
do
    echo "Currently uploading: $input"
    mongoimport -h HOSTNAME -d DATABASE -c COLLECTION \
        -u USERNAME -p PASSWORD --file "$input" --jsonArray
done