如何 运行 和循环 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 infile
与 mongoimport
命令一起使用。
有人可以告诉我我应该做什么吗?
您通常希望将子流程的参数放在列表中,否则您的实现可能会查找名称为完整字符串 (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
我有几个 .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 infile
与 mongoimport
命令一起使用。
有人可以告诉我我应该做什么吗?
您通常希望将子流程的参数放在列表中,否则您的实现可能会查找名称为完整字符串 (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