2010-12-21 14 views
1

Ich entwarf eine GUI-Anwendung mit WxPython, die mit einer lokalen Datenbank (Mongodb) in demselben Ordner kommunizieren. Meine Hauptanwendung hat den relativen Pfad zum Datenbank-Daemon, um sie jedes Mal zu starten, wenn die GUI gestartet wird.py2app ändert den Speicherort von eingebetteten Mongodb

Dies ist main.py:

import mongodb 

class EVA(wx.App): 
    # wxPython GUI here 
    pass 

if __name__ == "__main__": 
    myMongodb = mongodb.Mongodb() 
    myMongodb.start() 
    myMongodb.connect() 

    app = EVA(0) 
    app.MainLoop() 

Dies ist das mongodb.py Modul:

from pymongo import Connection 
import subprocess, os , signal 

class Mongodb(): 
    pid = 0 

    def start(self): 
     path = "/mongodb-osx-x86_64-1.6.5/bin/mongod" 
     data = "/data/db/" 
     cmd = path + " --dbpath " + data 
     MyCMD = subprocess.Popen([cmd],shell=True) 
     self.pid = MyCMD.pid 

    def connect(self): 
     try: 
      connection = Connection(host="localhost", port=27017) 
      db = connection['Example_db'] 
      return db 
     except Exception as inst: 
      print "Database connection error: " , inst 

    def stop(self): 
     os.kill(self.pid,signal.SIGTERM) 

Jedes Ding funktioniert vom Terminal in Ordnung. Wenn ich jedoch mit py2app eine Standalone-Version meines Programms unter Mac OS (OS v10.6.5, Python v2.7) erstellen konnte, kann ich die GUI zwar zu Mittag essen, aber die Datenbank nicht starten. Es scheint, dass py2app den Speicherort des ausführbaren Mongodb-Ordners geändert und meinen Code zerstört hat.

Ich verwende die folgenden Parameter mit py2app:

$ py2applet --make-setup main.py 
$ rm -rf build dist 
$ python setup.py py2app --iconfile /icons/main_icon.icns -r /mongodb-osx-x86_64-1.6.5 

Wie py2app zu zwingen, meine Anwendungsstruktur intakt zu lassen?

Danke.

Antwort

1

Py2app ändert das aktuelle Arbeitsverzeichnis beim Start in den Ordner foo.app/Content/Resources im App-Bundle. Es scheint nicht der Fall von dem Code zu sein, den Sie oben zeigen, aber wenn Sie irgendwelche Pfade haben, die von der CWD abhängig sind (einschließlich relativer Pfadnamen), dann müssen Sie damit irgendwie umgehen. Eine übliche Methode, um damit umzugehen, ist es, auch die anderen benötigten Dateien in den Ordner innerhalb des Anwendungspakets zu kopieren, so dass es wirklich ein eigenständiges Paket ist, das unabhängig von seinem Speicherort im Dateisystem ist und hoffentlich auch nicht davon abhängig ist Maschine, auf der es läuft.

+0

Ich habe eine Kopie des Datenbankordners im selben Ordner von "main.py" erstellt und es funktionierte gut als ein Bündel. Danke Robin. – sa9

Verwandte Themen