2011-08-03 20 views
15

Pythonで書かれたプログラムに変更をプッシュする最良の方法は何ですか?私は定期的に更新されるPythonで書かれたソフトウェアを持っています。これを行う最善の方法は何でしょうか?すべてのマシンにWindows 7がインストールされます。Pythonアプリケーションを遠隔更新する方法

また、私の質問のあいまいさを許してください。これは私の最初の更新手順を実装する必要があります。あなたが私に追加したいと思う具体的な言及を自由に感じてください。

+2

現在、インストール/配布用のアプリケーションをパッケージしていますか?それは単なるスクリプトファイルですか?アプリケーションのコードを更新する必要がありますか、Webからデータ更新を取得することについて話していますか? –

答えて

7

gitやsubversionなどのソース管理プログラムを使用することをお勧めします。また、誰もがコードを見ても大丈夫であれば、コードをgithubに投稿して、どこからでも引き出す​​ことができます。あなたはそれを非公開にすることができますが、それを支払う必要があり、すべてのユーザーはgithubアカウントを作成し、git installを使って設定します。

ソース管理プログラムを使用する場合、他の人はコマンドを実行して手動で編集をプルする必要がありますが、これを実行するスクリプトprバッチファイルを作成して起動時または定期的に実行させることができます。

これを行うには、SSHサポートとgitを設定してサーバーにコードを置く必要があります。あなたが設定したサーバーのすべてを通過したくなければ、私はgithubをお勧めします。

git- http://git-scm.com/(Windows版の場合は、ダウンロードに移動し、msysGitを選択)

githubの - https://github.com/

+0

ニールがここにスポットライトを当てています。 Mercurialとgitの両方が良い選択肢となり、x日ごとに呼び出され、最新版のリポジトリを取得する短い「自動更新」スクリプトを簡単に書くことができます。 – Jonathanb

9

あなたはすでにInnoSetupであなたのプログラムをパッケージ化していない場合、私は強く、あなたがそれに切り替えるお勧めします、この種のものを簡単にするための設備があるからです。 InnoSetupスクリプトには、ファイルがすでに存在する場合(つまり、内部に設定ファイルやそのようなものがある場合)更新されるべきでないファイルなど、特別な状況を指定することができます。

次に、クライアントマシンが新しいバージョンのアプリケーションを見つけられるようにするには、現在のリリースのバージョン番号と最新バージョンのインストーラexeのURLを持つ非常に小さなファイルを公開Webサーバーに保存します。このファイルを有効にするには、新しいバージョンのプログラムをリリースするたびに、このファイルとInnoSetupスクリプトのバージョン番号、およびプログラム内のある種のAPP_VERSION定数を更新する必要があります。

その後、アップデータ自身のこれらの部分を処理する必要があります:

  1. 新しいバージョンがHTTP経由でWebサーバーから現在のバージョンのファイルを取得し、バージョンを比較することで利用可能になったときの検出アプリの独自のAPP_VERSIONに番号を付けます。クライアントマシンにインターネットアクセスがなく、要求を実行している間にGUIをブロックしない場合は、正常に失敗するようにこのクエリーを実行してください(ネットワークの問題によりクエリが強制的に待機する場合タイムアウトのために長い間)。
  2. 新しいバージョンがある場合は、ユーザーに更新するかどうかを尋ね、「はい」と答えた場合は、更新されたインストーラをTEMPディレクトリにダウンロードします。使用しているGUIツールキットに応じて、ダウンロード中に進行状況ダイアログを表示するためのさまざまなメカニズムがあります。これはインストーラが少なくともMBである可能性が高いため、良い考えです。
  3. アプリを終了し、特別なアップデートスクリプトin the backgroundを実行して、アプリをもう一度起動します。

更新スクリプトはこれを行うには(最も簡単な方法は、それが行くまでそう毎秒かをコマンドライン引数として元のプロセスのPIDを渡し、更新スクリプトsend a query signal 0 to that processを持つことで、完全に死ぬことを、元のプロセスを待ちますこれで、インストーラーはバックグラウンドでサイレントモードで実行され、おそらくユーザーに「お待ちください...」ダイアログが表示されます。インストーラが終了し、戻りコードで成功を報告すると、アップデータはプログラムを再起動できます。

あなたのアプリの大きさによっては、これはgitや別のSCMを使用する方法よりも帯域幅が無駄になります。この方法でアップデートするたびに、アプリケーションの最新バージョン用のインストーラ全体がダウンロードされますが、SCMは変更されたファイルのみをダウンロードします。ただし、通常のWebサーバー以外の特別なサーバー機能は必要なく、ユーザーのコンピューターにSCMクライアントを特別にインストールする必要はないという利点があります。

さらに、InnoSetupは一般的にクールです。 :-)

+0

既存のアプリがまだ開いているかどうかを確認するもう1つの技術的に甘い方法は、アプリが実行中のときにいつでも所定の名前で一時ファイルに読み取りロックを取得させることです。あなたのアプリがそのPIDを解放するが、別の新しいアプリが即座に同じPIDをとる可能性は低いが起こり得る競合状態のシナリオを避けるので、これはクールだ。また、ユーザーがアプリの複数のインスタンスを起動するのを防ぎ、アップデータを混乱させる可能性があります。 – DSimon

関連する問題