2016-12-10 3 views
0

settings.txtはコンパイルされた単一ファイルアプリ内に保存され、アクセスされますが、これは、ファイルがスクリプトと同じディレクトリにある場合、Pyinstallerコンパイルの前に機能します。Pyinstallerアプリはtxtファイルにアクセスしていますが、書き込みはしていません(アプリのコンパイル前に動作します)

pyinstaller script.spec script.py --windowed --onefile

a.datasとしてspecファイルに設定されている:

アプリは、端末からコンパイルさ

a.datas += [(‘settings.txt’,’/path/to/settings.txt’, "DATA”)]

とファイルは、アプリケーション内で適切に読み取られる。

with open(resource_path('settings.txt'), 'r') as f2 

ただし、ファイルを上書きしようとしたときにファイルが更新されません:あなたは、Windows上にある場合

def resource_path(relative_path): 
    """ Get absolute path to resource, works for dev and for PyInstaller """ 
    try: 
     # PyInstaller creates a temp folder and stores path in _MEIPASS 
     base_path = sys._MEIPASS 
    except Exception: 
     base_path = os.environ.get("_MEIPASS2", os.path.abspath(".")) 

    return os.path.join(base_path, relative_path) 
+0

'f2.write(「更新」)'は、データを失うことを。アプリケーションを終了する前に 'f2.close()'が必要です。 – dsgdfg

+0

'with'を使用するとclose()メソッドが自動的に呼び出されると信じています – Phillip

+0

設定ファイルが空の場合、いいえ! – dsgdfg

答えて

1

は、_MEIPASSのために「ショート」の名前を返します。

def OnExit(self, event): 
    with open(resource_path('settings.txt'), 'w') as f2: 
     f2.write('update') 

    self.Destroy() 

resource_pathは以下のように定義されますそのコンポーネントが8文字を超える場合のパス。したがって、これが問題であることをテストするには、アプリをフリーアプリone-folderにして、シンプルで短いパスで移動してください(例:C:/test)。

これが問題であるならば、あなたのような何か使用して長いパスを取得することで、問題を回避することができます。ファイルを閉じていない場合

if hasattr(sys, '_MEIPASS'): 
    import win32api 
    sys_meipass = win32api.GetLongPathName(sys._MEIPASS) 
関連する問題