【发布时间】:2015-04-10 15:30:52
【问题描述】:
我正在尝试编写一个 python 脚本来启动 mongod,创建一个数据库(或打开一个我已经创建的数据库),添加一些信息,然后关闭 mongod。
#!/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()
此代码有效,但阅读 python 文档,他们说在子进程中使用 shell=True 是个坏主意。我对这些东西很陌生,我真的不明白 shell=True 标志在做什么,但我知道当输入是变量时访问 shell 是不好的。问题是,当我尝试运行此删除 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
不确定它是否重要,但在工作情况和失败情况下,我在 sublime text3 的脚本末尾使用create_mongo_database('test5_database', '~/computation/db') 运行它。
所以我的问题是 - 在这种情况下使用 shell=True 危险吗?我不shell=True为什么程序运行不起来?
编辑:鉴于 Dano 和 Charles Duffy 的解释,我现在将命令更改为:
mongod = subprocess.Popen(
["mongod", "--dbpath", path_to_database],
)
但是,如果path_to_database 包含~/,这仍然不起作用。换句话说,/Users/myusername/path/to/db 有效,但 ~/path/to/db 无效。我最初的问题得到了很好的回答,我绝对可以做到这一点,不确定这个新的皱纹是否应该成为一个新的问题......
【问题讨论】:
-
思想实验:如果您的数据库位于名为
"/computation/$(rm -rf .)/db"的目录中会发生什么? -
我想我的硬盘上什么都没有了?那会很有趣...
-
是的(最坏的情况,取决于细节)!但实际上是由
shell=True调用的shell 支持该扩展;如果没有外壳,则名称仅被视为文字文件名。 -
回复:您对问题的扩展,请参阅docs.python.org/2/library/os.path.html#os.path.expanduser;我也适当地扩展了我的答案。
标签: python mongodb shell subprocess