开发者

py2app changes the location of embedded Mongodb

开发者 https://www.devze.com 2023-01-31 20:18 出处:网络
I designed a GUI application using wxPython that communicate with a local database (Mongodb) located in the same folder. My main application has the relative path to the datab开发者_如何学JAVAase daem

I designed a GUI application using wxPython that communicate with a local database (Mongodb) located in the same folder. My main application has the relative path to the datab开发者_如何学JAVAase daemon to start it every time the GUI is lunched.

This is the 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()

This is the mongodb.py module:

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)

Every thing works fine from the terminal. However, when I used py2app to make a standalone version of my program on Mac OS (OS v10.6.5, Python v2.7), I am able to lunch the GUI but can't start the database. It seems py2app changed the location of Mongodb executable folder and broke my code.

I use the following parameters with 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

How to force py2app to leave my application structure intact?

Thanks.


Py2app changes the current working directory to the foo.app/Content/Resources folder within the app bundle when it starts up. It doesn't seem to be the case from the code you show above, but if you have any paths that are dependent on the CWD (including relative pathnames) then you'll have to deal with that somehow. One common way to deal with it is to also copy the other stuff you need into that folder within the application bundle, so it will then truly be a standalone bundle that is not dependent on its location in the filesystem and hopefully also not dependent on the machine it is running upon.

0

精彩评论

暂无评论...
验证码 换一张
取 消