2010-12-21 40 views
1

我设计了一个使用wxPython的GUI应用程序,它与位于同一文件夹中的本地数据库(Mongodb)进行通信。我的主应用程序有数据库守护进程的相对路径,每次GUI启动时都会启动它。py2app更改嵌入式Mongodb的位置

这是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() 

这是mongodb.py模块:

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) 

每一件事情正常工作从终端。但是,当我使用py2app在Mac OS(OS v10.6.5,Python v2.7)上创建我的程序的独立版本时,我能够午餐GUI,但无法启动数据库。 看来py2app改变了Mongodb可执行文件夹的位置并破坏了我的代码。

我用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 

如何强制py2app离开我的应用程序结构是否完整?

谢谢。

回答

1

当启动时,Py2app将当前工作目录更改为应用程序包内的foo.app/Content/Resources文件夹。从上面显示的代码看来并不是这样,但是如果你有任何依赖于CWD的路径(包括相对路径名),那么你必须以某种方式处理。处理这个问题的一个常见方法是,将所需的其他内容复制到应用程序捆绑包中的该文件夹中,以便它真正成为独立的捆绑包,而不依赖于它在文件系统中的位置,并且希望也不依赖于它运行的机器。

+0

我在'main.py'的同一个文件夹中创建了一个数据库文件夹的副本,并且它作为一个包正常工作。谢谢罗宾。 – sa9 2010-12-26 23:15:19