1

現在py2exeを使用してexeをビルドし、WiXツールセットを使用してMSIをビルドするWindowsサービスが動作しています。

この構造は機能しますが、サービスのサイレント更新と自動更新のために esky をミックスに導入すると、更新されたバージョンを適切に取得できません。

from distutils.core import setup
import  shutil, os
from esky import bdist_esky

# Setup.py for Windows Service. Works with Py2exe

#
class Target:
    def __init__(self, **kw):
        self.__dict__.update(kw)
        self.version = "1.0.0"
        self.company_name = ""
        self.copyright = "2015"
        self.name = " Edit Service"


myservice = Target(
    description = 'Edit Tracker Service',
    modules = ['Logon_Service'],
    cmdline_style='pywin32'
)


setup(
    name = " Edit Service",
    data_files=[('files', ['configs.yaml']),
               ],
    version = "1.0.0",
    options = {
        "bdist_esky":
        {
        "includes": ['yaml', 'pymysql', 'win32timezone'],
        "freezer_module": 'py2exe',
        }
    },
    zipfile = None,
    service=[myservice]
)

python setup.py bdist_esky上記の setup.py を実行すると、.zip ファイルが作成されます。解凍後、実行可能ファイルとサービスを適切にインストールして開始できます。

バージョン番号を増やしてpython setup.py bdist_esky再度実行すると、別の zip ファイルが作成されます。

次に、元の.exe を実行すると、更新が正しく認識されますが、実行に失敗し、次の例外が返されます。

You are running: 1.0.0 ('ERROR UPDATING APP:', OSError(None, 'unable to cleanup: startup hooks not run' ))

eskyに関連する私のWin32Service実装の抜粋は次のとおりです

if getattr(sys, "frozen", False):
    app = esky.Esky(sys.executable, "http://localhost.com:8000")
    print "You are running: %s" % app.active_version
    try:
        if(app.find_update() != None):
            app.auto_update()
            appexe = esky.util.appexe_from_executable(sys.executable)
            os.execv(appexe,[appexe] + sys.argv[1:])
    except Exception as e:
        print("ERROR UPDATING APP:", e)
    app.cleanup()

さらに情報が必要な場合は、必要に応じてコードを追加します。目標は、以下を達成することです。

  1. ビルド実行可能ファイル / MSI
  2. どこにでも展開
  3. 中央サーバーから自動的に更新します。

私はディストリビューションとエスキー全般に非常に慣れていません。あらゆるアドバイスをいただければ幸いです。

4

0 に答える 0