如何 运行 和循环 bash 脚本命令形式 Python 脚本

how to run and loop a bash script command form Python script

我有几个 .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 文件的参数,但我无法在循环中传递该文件名,我不能将 print infilemongoimport 命令一起使用。

有人可以告诉我我应该做什么吗?

您通常希望将子流程的参数放在列表中,否则您的实现可能会查找名称为完整字符串 (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