Я пытаюсь написать скрипт python, который запустит mongod, создаст базу данных (или откройте базу данных, которую я уже сделал), добавьте некоторую информацию и затем выключите монгод.Открытие Mongod в python, как избежать `shell = True`
#!/usr/bin/env python
from pymongo import MongoClient
import subprocess
def create_mongo_database(database_name, path_to_database):
mongod = subprocess.Popen(
"mongod --dbpath {0}".format(path_to_database),
shell=True
)
client = MongoClient()
db = client[database_name]
collection = db['test_collection']
collection.insert_one({'something new':'some data'})
mongod.terminate()
Этот код работает, но читать питон документы, они говорят, что с помощью shell=True
в подпроцессе является плохой идеей. Я довольно новичок в этом, и я действительно не понимаю, что делает флаг shell=True
, но я понимаю, что доступ к оболочке, когда переменная ввода является плохим. Проблема заключается в том, когда я пытаюсь запустить это удаляя shell=True
аргумент, я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "/Users/KBLaptop/computation/kvasir/mongo_test2.py", line 23, in <module>
create_mongo_database('test5_database', '~/computation/db')
File "/Users/KBLaptop/computation/kvasir/mongo_test2.py", line 12, in create_mongo_database
"mongod --dbpath {0}".format(path_to_database),
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 709, in __init__
errread, errwrite)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1326, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Не уверен, если это имеет значение, но и в рабочем случае и неисправного случае, я бегу это с create_mongo_database('test5_database', '~/computation/db')
в конце сценария в возвышенном тексте3.
Так что мои вопросы - это shell=True
опасный в этом случае? Почему программа не запускается, если я не делаю shell=True
?
EDIT: Учитывая объяснения Дано-х и Чарльз Даффи, Я теперь изменил команду:
mongod = subprocess.Popen(
["mongod", "--dbpath", path_to_database],
)
Однако, это все еще не работает, если path_to_database
содержит ~/
. Другими словами, /Users/myusername/path/to/db
работает, но ~/path/to/db
нет. Мой первоначальный вопрос хорошо ответил, и я могу определенно сделать эту работу, не уверен, что у этой новой морщинки должен быть задан новый вопрос или нет ...
Мысленный эксперимент: что произойдет, если ваша база данных находится в каталоге с именем '/ computation/$ (rm -rf.)/Db?'? –
Предполагаю, что на моем жестком диске ничего не осталось бы? Это было бы весело ... – kevbonham
Yup (в худшем случае, в зависимости от деталей)! Но это оболочка, вызываемая 'shell = True', которая на самом деле чтит это расширение; если оболочки нет, тогда имя просто рассматривается как буквальное имя файла. –