2010-06-06 61 views
0

我正在開發一個python應用程序,並有一個關於編碼的問題,以便在用戶通過setup.py install或類似方法將其安裝到他或她的機器上後仍然可以工作。setup.py安裝後訪問文件

在我的文件中的一個,我用的是以下幾點:

file = "TestParser/View/MainWindow.ui" 
cwd = os.getcwd() 
argv_path = os.path.dirname(sys.argv[0]) 
file_path = os.path.join(cwd, argv_path, file) 

,以獲得路徑MainWindow.ui,當我只知道相對於主腳本的位置的路徑。無論我稱之爲主腳本,這都是有效的。

問題是,用戶在他或她的機器上安裝應用程序後,相對路徑是不同的,所以這是行不通的。我可以使用__file__,但根據this,py2exe沒有__file__

是否有一個標準的方法來實現這一目標?還是更好的方法?

編輯:

應我甚至擔心py2exe,只是使用__file__?我沒有立即計劃使用py2exe,但我希望能夠學習適當的訪問文件的方式。

+0

也許我錯過了一些東西,但爲什麼不是你的安裝程序將TestParser/*複製到與其他所有位置相同的位置?相對路徑應該工作,無論應用程序居住在哪裏,只要所有的路徑都是「相對的」=) – 2010-06-07 01:24:21

+0

@Dan McDougall我還在學習python的setup.py和朋友,所以我可能會錯過一些東西,但安裝了腳本在bin目錄中,而模塊存儲在lib下。所以它的命令行腳本與其他所有內容分開存儲。我認爲有一些標準的方式來建立我不知道的項目分配。 – Matthew 2010-06-07 06:56:12

+0

可能重複? http://stackoverflow.com/questions/1219367/accessing-data-files-before-and-after-distutils-setuptools – Matthew 2010-06-09 21:30:56

回答

1

使用setup.py,永遠不會有一個適用於所有場景的簡單答案。 Setup.py是一個龐大的PITA,可以使用不同的安裝程序(例如,「setup.py install」,py2exe,py2app)。

例如,在我的應用程序,我有這樣的代碼來查找應用程序需要的文件:

def getHome(): 
    if hasattr(sys, "frozen"): 
    if sys.platform == "darwin": # OS X 
     return os.path.join(os.path.dirname(os.path.dirname(sys.executable)), "Resources") 
    return os.path.dirname(sys.executable) 
    else: 
    return os.path.dirname(__file__) 

「凍結」設置爲與py2exe和py2app創建應用程序。

所以要回答你的問題,請使用__file__,不要擔心py2exe。如果您需要使用py2exe,您可能需要創建一個特殊情況。