2014-02-18 90 views
11

我正在使用Py2exe創建一個可執行文件作爲一個Windows服務。訪問被拒絕使用Py2exe

當我運行該腳本,我得到這個錯誤:

File "C:\TeamCity\buildAgent\work\582d895bd5b431ac\winpython\WinPython-32bit-2.7.3.3\python-2.7.3\lib\site-packages\py2exe\build_exe.py", line 860, in build_executable add_resource(ensure_unicode(exe_path), script_bytes, u"PYTHONSCRIPT", 1, True) RuntimeError: EndUpdateResource: Access is denied.

這是調用py2exe:

setup(
    name = NAME, 
    description = DESCRIPTION, 
    version = '1.0.133.43', 
    service = [{'modules':["ServiceLauncher"], 'cmdline':'pywin32'}], 
    zipfile=None, 
    options = { 
     "py2exe":{"packages":"encodings", 
        "includes":"win32com,win32service,win32serviceutil,win32event", 
        "excludes":"libiomp5md.dll" 
     }, 
     }, 
    ) 

僅在構建機上出現的問題,它運行在我的dev的罰款PC。

我試圖將工作文件夾中的每個人都設置完全控制,但它不起作用。

有什麼想法?

謝謝。

+0

出於好奇,如果可能,請嘗試使用較短的路徑名稱。 Windows中的路徑太長時會出現奇怪的錯誤。 – Torxed

+0

錯誤可能不是訪問文件系統上的特定文件,而是其他功能,如註冊表項或服務管理器設置(因爲我注意到您正在使用'ServiceLauncher','win32service'等...) 。你是否以管理員身份運行? – abarnert

+0

我以管理員身份運行。 我嘗試了一條較短的路徑,但沒有運氣...... –

回答

35

經過兩天的調查,我們在IT人員的幫助下找到了一個解決方案。

當py2exe嘗試修改添加元數據和\或圖標的可執行文件時,會出現此問題。

根本原因?簡單...抗病毒藥。

它認爲操作威脅並導致訪問被拒絕錯誤。

謝謝大家!

+0

感謝您回答這個問題。我遇到了同樣的問題,搜索了它,發現了這個答案,禁用了殺毒軟件,再次運行,並且都很好。總時間:1分鐘大概救了我幾個小時! – jozzas

+3

如果您無法禁用防病毒,則運行構建過程(py2exe)兩次可能會有所幫助。它爲我工作,因爲它第一次構建library.zip並失敗。第二次,它能夠構建可執行文件。 – syam

+0

@syam感謝提這個=) –

1

我發現從互聯網斷開連接足以解決問題(儘管這可能與禁用所提議的防病毒解決方案有關)。

0

另一個可能的解決方案是,你已經有一個dist文件夾中的文件 - 我做了(忘了我已經運行py2exe)。刪除該文件夾,它再次工作

+0

這並沒有提供一個問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/11012129) –

+0

@FabioLamanna我遇到了與作者類似的問題,這是一個解決方案,爲我工作。對於其他可能最終落入我的鞋子的人來說,如果他們遇到這個帖子,這是一個很好的資源。 – Jona

0

問題很可能是一個防病毒程序阻止寫入.exe文件的訪問,如其他人已經注意到的。如果您不能或不想禁用防病毒軟件,則在您的setup.py文件開頭處的以下修補程序將在修改之前重命名文件以避免.exe擴展名,並在之後將其重命名。

import py2exe.py2exe_util 
from py2exe.py2exe_util import add_resource 
import os 

def add_resource_patch(name, *arg, **kwarg): 
    name_tmp = name + '.tmp' 
    os.rename(name, name_tmp) 
    add_resource(name_tmp, *arg, **kwarg) 
    os.rename(name_tmp, name) 

py2exe.py2exe_util.add_resource = add_resource_patch 

from distutils.core import setup 
import py2exe 
setup(...)