2017-07-02 45 views
0

實驗軟件sacred在沒有MongoDB的情況下運行,配置爲mongo-observer。當它試圖寫入MongoDB的設置,這個失敗,創建文件/tmp/sacred_mongo_fail__eErwU.pickle,與消息如何導入pickle文件,如果神聖無法連接到MongoDB

Warning: saving to MongoDB failed! Stored experiment entry in /tmp/sacred_mongo_fail__eErwU.pickle 
Traceback (most recent calls WITHOUT Sacred internals): 
    File "/usr/local/lib/python2.7/dist-packages/sacred/observers/mongo.py", line 127, in started_event 
    self.run_entry[experiment][sources] = self.save_sources(ex_info) 
    File "/usr/local/lib/python2.7/dist-packages/sacred/observers/mongo.py", line 239, in save_sources 
    file = self.fs.find_one({filename: abs_path, md5: md5}) 
    File "/usr/local/lib/python2.7/dist-packages/gridfs/__init__.py", line 261, in find_one 
    for f in self.find(filter, *args, **kwargs): 
    File "/usr/local/lib/python2.7/dist-packages/gridfs/grid_file.py", line 658, in next 
    next_file = super(GridOutCursor, self).next() 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 1114, in next 
    if len(self.__data) or self._refresh(): 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 1036, in _refresh 
    self.__collation)) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 873, in __send_message 
    **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 888, in _send_message_with_response 
    server = topology.select_server(selector) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 214, in select_server 
    address)) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 189, in select_servers 
    self._error_message(selector)) 
ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused 

這怎麼泡菜文件手動導入到MongoDB的?

回答

0
  1. 裝入泡菜文件,
  2. 設置_id
  3. 插入

db = pymongo.MongoClient().sacred 
entry = pickle.load(open('/tmp/sacred_mongo_fail__eErwU.pickle')) 
entry['_id'] = list(db.runs.find({}, {"_id": 1}))[-1]['_id'] 
db.runs.insert_one(entry) 

這是快速和骯髒的,依賴於find列出,以便對象,並可以使用Cleanest way to get last item from Python iterator而不是list(...)[-1],但它應該可以工作。

+0

我覺得這個答案在正確的軌道上,但它並沒有爲我工作。對於初學者來說,我在pickle文件中的實驗已經有了'_id'字段,並且open命令需要'rb'參數在python3中以二進制形式打開......但即使如此,即使insert_one命令沒有返回一個錯誤,它並不實際更新數據庫中的(現有)記錄。有任何想法嗎? – clemej

+0

@clemej:如果'_id'已經存在,你可以'find_one_and_update'。請參閱https://stackoverflow.com/a/46608956/1587329等。 –