2014-09-25 27 views
0

Nginx的與WSGI加載在我的根目錄下一個名爲run.py如何在導入的模塊中獲取python wsgi應用程序的根目錄?

run.py我得到的根目錄與

ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))

這工作得很好。

我現在想要在導入的模塊中訪問這個根變量。我聽說全局變種是邪惡的。但將根路徑傳遞到我想要使用的模塊看起來很奇怪。什麼是最Python的方式來處理這個?

另外 - 我想要根路徑的原因是因爲我在導入的模塊中這樣做。

os.chdir('/some/path')

,我想在腳本後來改回根路徑。

os.chdir(ROOT)

謝謝...

回答

1

我要說的是,雖然它似乎很奇怪你的,明確的如果您在模塊內部需要它,將路徑傳遞給模塊實際上是最佳解決方案。

此外,您應該確保您的模塊始終使用絕對路徑(也就是說,您根本不需要chdir)。

原因是當前工作目錄是全局狀態(它的範圍是過程')。正如你所提到的,全局狀態是「邪惡」的 - 它可以被你的任何一個模塊自由地修改,這可能導致微妙的錯誤 - 特別是在處理併發時(as in a threaded WSGI webserver)。

如果你真的想chdir,您可以use a context manager避免忘記改回來,但這並不能解決併發訪問問題

+0

是的,我一直在chdir的全球性問題。是在搞亂我的腳本。感謝學習 - 真的很有幫助。 – Boz 2014-09-25 17:16:35

2

如何記住當前工作目錄,稍後再恢復:

ROOT = os.getcwd() 
os.chdir('/some/path') 
... 
os.chdir(ROOT) 
+0

它工作。我在某處讀到os.getcwd()在所有情況下都不可靠。你知道爲什麼嗎? (或者我誤解了它) – Boz 2014-09-25 17:14:23

+1

@Boz,如果你的程序是多線程的並且每個線程都改變了工作目錄,'os.getcwd()'不可靠地工作。如果程序是單線程的,並且沒有額外的'chdir()'調用,那沒關係。 – falsetru 2014-09-25 17:23:11

+0

感謝您的澄清。我將盡量避免使用它。 – Boz 2014-09-25 20:19:07

相關問題