2016-01-23 45 views
0

當我運行從主我的代碼,它運行完全正常,但是當我嘗試建立主要爲使用py2exe exe文件,它給這個錯誤:py2exe是給我os.listdir代碼中的錯誤

Traceback (most recent call last): 


File "main.py", line 118, in <module> 
    menu.menu.Menu() 
    File "menu\menu.pyo", line 20, in __init__ 
    File "settingsManager.pyo", line 61, in getSetting 
    File "settingsManager.pyo", line 148, in __init__ 
WindowsError: [Error 3] The system cannot find the path specified: 'C:\\Users\\digiholic\\git\\universalSmashSystem\\main.exe\\settings\\rules/*.*' 

它指的是該生產線是:

for f in os.listdir(os.path.join(os.path.dirname(__file__),'settings','rules')): 

看起來os.listdir使用UNIX文件尋路找到的每個文件,並且Windows有沒有這一點。有沒有辦法以不會炸燬所有東西的方式使用listdir?

+2

的路徑是有效的?從我所看到的,'main.exe'是一個文件,所以更多的路徑組件是沒有意義的。 –

+0

正斜槓沒有問題(Windows同時接受)。但是當你打包成EXE時,你正在尋找的文件將不存在。 – ShadowRanger

+0

所以,你是對的,main.exe不應該在路徑中。爲什麼os.path.dirname(\ _ \ _ file \ _ \ _)給我的文件名而不是它的目錄? –

回答

2

當你在exe文件中運行時,你需要檢查模塊是否爲frozen,當你處於exe文件與原始python腳本之間時,__file__的路徑通常不是你期望的。你需要像這樣的東西來訪問的位置:

import imp, os, sys 

def main_is_frozen(): 
    return (hasattr(sys, "frozen") or # new py2exe 
      hasattr(sys, "importers") # old py2exe 
      or imp.is_frozen("__main__")) # tools/freeze 

def get_main_dir(): 
    if main_is_frozen(): 
     return os.path.dirname(sys.executable) 
    return os.path.dirname(sys.argv[0]) 

來源:http://www.py2exe.org/index.cgi/HowToDetermineIfRunningFromExe 您也可以點擊這裏另一個方向:http://www.py2exe.org/index.cgi/WhereAmI

+1

注意PyInstaller有一個類似的概念在這裏描述:https://pythonhosted.org/PyInstaller/#run-time-information –

+0

我該如何去做更深層次的樹的文件的dirname?例如,如果我有「

/stages/arena.py」,並且arena.py想知道它自己的dirname(
/stages),我會怎麼做呢?使用sys.argv只會給我主目錄。 –

+0

我個人使用PyInstaller,所以我不確定它是如何與P2Exe協同工作的,當涉及到訪問嵌入式文件,相對於exe/py等文件時。您可能只需要在在exe中,這是我第一次處理凍結模塊時所做的。 –