他の人が私のpythonプログラムを実行できるようにする確実な方法


17

PythonプログラムをGitHubに配置して、他の人にさまざまなオペレーティングシステムがインストールされているコンピューターにダウンロードして実行してもらいたいと思います。私は比較的pythonに慣れていませんが、含まれているすべてのモジュールのさまざまなバージョンを一緒に動作させると問題が発生する可能性があることに気づくのに十分使用しました。requirements.txt(で生成されpipreqs、コマンドでデプロイされた)の使用を発見したばかりですが、実際に使用されているpythonのバージョンが明示されていないため、それ自体では完全なソリューションではないことpip install -r /path/to/requirements.txtに非常に驚いてrequirements.txtいます。だから私の質問は:私のプロジェクトをダウンロードしている誰かが実際に可能な限り少ない問題でそれを実行できるようにするためにどの仕様/ファイル/何か他のものが必要であるかです。

編集:私の計画は、最も多くの賛成票を得た回答によって導かれることでした。しかし、これまでのところ、4つの回答と127のビューの後、単一の回答では1つの賛成票もありません。いくつかの回答が良くない場合、なぜそれらが良くないのについていくつかのコメントを見ると役に立ちます。


1
可能な限り少ない問題で、Docker(または他のコンテナーベースのソリューション)を検討しましたか?docker.com
Zaccharie Ramzi

Re:Docker ...これが見つかりました:「開発者はアプリケーションが他のLinuxマシンで実行されるので安心できます」-しかし、これをどのOSでも機能させたい。(opensource.com/resources/what-docker
ミック

通常、すべての従来のOSをサポートしています。windowsdocs.docker.com/docker-for-windows)とmac(docs.docker.com/docker-for-windows
Zaccharie Ramzi

2
ここでの答えは非常に状況に応じたものです。Pythonプログラムはsysosまたはサブプロセスタイプの関数、またはより数学的/分析的なことをしていますか?前者はPythonのバージョンごとに変わる可能性があり、後で完全にバージョン非依存になる可能性があります。依存ライブラリは何ですか?numpyとpandasはプラットフォーム間で素晴らしい働きをするので、最小バージョンがあることを確認できます。Pythonのメジャーバージョンは何ですか?依存ライブラリを使用するPython 2.xと3.xの違いはさらに難しくなります。一般的なメジャーリリースをターゲットにした適切なコードを作成すると、すばらしいスタートです。
dawg

2
無数の回答からも明らかなように、これについては非常に多くの方法があります。アプリケーションが何であるかを知ることに基づいて答えが変わるかどうか、私は本当に興味があります。それは問題ではないと私は信じたいのですが、それは問題ではないかと思います。また、それは対象とする聴衆に大きく依存すると思います。機械学習アプリケーションを実行する精通した物理学博士とチェッカーのパイゲームをするジョーインターネット。
Marcel Wilson

回答:


15

setup.pyファイルの設定を検討しましたか?これは、すべてを1つにまとめるのに便利な方法です。したがって、ユーザーがしなければならないことは、A)リポジトリのクローンを作成し、B)実行するpip install .ために実行するだけです。setup.py

これについては素晴らしいスタックの議論があります。

リクエスト担当者が作成したハンドルの例も同様です。

これはほとんどのユースケースをカバーするはずです。これを本当に配布可能にしたい場合は、公式の配布ハブであるPyPi設定することを検討する必要があります。

それ以上に、プログラムを「OS独立」にする方法を尋ねている場合、1つのサイズですべてに対応できるわけではありません。それはあなたがあなたのコードで何をしているかに依存します。特定のコードがそれらのOSなどとどのように相互作用するかを調査する必要があります。


7

これを行うには、多くの、多くの、多くの、多くの、多くの、多くの、多くの多くの方法があります。私はそれぞれの背後にある原則について滑って、それはユースケースです。

1. Python環境

これを行うには多くの方法があります。pipenv、conda、requirments.txtなど

これらのいくつかでは、Pythonのバージョンを指定できます。それ以外の場合は、動作することがわかっているPythonバージョンの範囲を指定するだけです。たとえば、Python 3.7を使用している場合、3.6をサポートしない可能性は低いです。わずかな変更が1つまたは2つあります。3.8も動作するはずです。

別の同様の方法はsetup.pyです。これらは一般に、インポート/コマンドラインで使用するPyInstaller(後述する別のソリューション)、numpy、wxPython、PyQt5などのライブラリの配布に使用されます。Pythonパッケージガイドは非常に便利で、そこにはたくさんのチュートリアルがあります。(google python setup.py tutorial)これらのファイルで要件を指定することもできます。

2.コンテナ

Dockerは大きなものです。聞いたことがない人はびっくりします。要約の迅速なGoogleが思い付くこの私がの一部を引用しますました、:

では、なぜ誰もがコンテナとDockerを愛するのでしょうか。以前はParallelsのサーバー仮想化のCTOであり、主要なLinuxカーネル開発者であるJames Bottomleyは、Hyper-V、KVM、XenなどのVMハイパーバイザーはすべて「仮想ハードウェアのエミュレーションに基づいている」と説明しました。システム要求。"

ただし、コンテナは共有オペレーティングシステムを使用します。つまり、システムリソースの点で、ハイパーバイザーよりもはるかに効率的です。ハードウェアを仮想化する代わりに、コンテナーは単一のLinuxインスタンスの上に置かれます。これは、「無駄な99.9%のVMジャンクを残して、アプリケーションを含む小さくてすっきりとしたカプセルを残せる」ことを意味します。

それはあなたのためにそれを要約するはずです。(コンテナに特定のOSは必要ないことに注意してください。)

3.実行可能ファイル

これを書いている時点でこれを行う2つの主要なツールがあります。PyInstaller、およびcx_Freeze。どちらも積極的に開発されています。どちらもオープンソースです。

スクリプトを取得し、ツールがそれをバイトコードにコンパイルし、インポートを見つけてコピーし、エンドユーザーがPythonを必要とせずにターゲットシステムでスクリプトを実行するポータブルPython環境を作成します。

個人的には、PyInstallerを好みます-私は開発者の1人です。PyInstallerは、コマンドラインスクリプトを通じてすべての機能を提供し、考えられるほとんどのライブラリをサポートしています。cx_Freezeにはセットアップスクリプトが必要です。

どちらのツールもWindows、Linux、macOSなどをサポートしています。PyInstallerは単一ファイルのexeまたは1つのフォルダーバンドルを作成できますが、cx_Freezeは1つのフォルダーバンドルしかサポートしません。PyInstaller 3.6はpython 2.7と3.5-3.7をサポートしますが、4.0 python 2をサポートしません。cx_Freezeは、前回のメジャーリリース(6.0だと思います)でpython 2のサポートを終了しました。

とにかく、ツールの機能については十分です。あなたはそれらを自分で調べることができます。(詳細については、https://pyinstaller.orgおよびhttps://cx-freeze.readthedocs.ioを参照してください

この配布方法を使用する場合、通常はGitHubリポジトリでソースコードを提供し、いくつかのexeファイル(プラットフォームごとに1つ)をダウンロードして準備し、コードを実行可能ファイルにビルドする方法を説明します。


1

これまでに私がこれまで使用してきた最高のツールはPipenvです。開発者のpip + virtualenvワークフロー全体を統合および簡素化するだけでなく、他の人がプロジェクトを実行するときに、すべての依存関係(Python自体を含む)の正確なバージョンが確実に満たされるようにします。

プロジェクトのWebサイトは、ツールの使用方法を説明するのにかなり優れていますが、完全を期すために、ここで簡単に説明します。

Pipenvをインストールすると(たとえばを実行してpip install --user pipenv)、プロジェクトのディレクトリに移動してを実行pipenv --python 3.7できるため、Pipenvはプロジェクトに新しいvirtualenvを作成し、PipfileとPipfile.lockを作成します(詳細については後で説明します)。 。先に進んで実行pipenv install -r requirements.txtすると、すべてのパッケージがインストールされます。これpipenv shellで、a pipenv run your_main_file.pyを実行して新しいvirtualenvをアクティブ化したり、a を使用してプロジェクトを実行したりできます。

次に、Pipfileの内容を見てみましょう。これは次のようになります。

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

このファイルには、プロジェクトの依存関係に関する人間が読める仕様があります(Pythonのバージョンも指定されていることに注意してください)。requirements.txtに固定されたバージョンがあった場合、Pipfileにもそれらが含まれる可能性がありますが、正確なバージョンがPipfile.lockに格納されているため、それらを安全にワイルドカード化できます。これでpipenv update、依存関係の更新などを実行できるようになり、PipfileとPipfile.lockをVCSにコミットすることを忘れないでください。

ユーザーがプロジェクトのクローンを作成したらpipenv install、あとは実行するだけで、残りはPipenvが処理します(適切なバージョンのPythonをインストールすることもできます)。

これがお役に立てば幸いです。私はPipenvとは何の関係もありません。この素晴らしいツールを共有したいと思っています。


1

プログラムがGUIにあまり関わっていない場合、またはWeb GUIがある場合は、Google Colaboratoryを使用してコードを共有できます。

https://colab.research.google.com/

誰もが同じ環境で実行できます。インストールの必要はありません。


1

すべてのpythonスクリプトを1つの実行可能ファイルに変換すると役立つ場合は、以下の私の答えが役立ちます...

大規模なデスクトップアプリケーションを純粋にPythonで開発して3年になります。これは、pyqtライブラリ(QT C ++フレームワークのPythonバインディング)の上に構築されたGUIベースのツールです。

私は現在「py2exe」パッケージ化ライブラリを使用しています:PythonスクリプトからスタンドアロンのWindows実行可能プログラム(32ビットおよび64ビット)を構築できるdistutils拡張機能です。あなたがしなければならないすべてはすることです:

  1. インストールpy2exe: 'pip install py2exe'

  2. setup.pyスクリプトを作成します。これは、最終的なEXEのコンテンツ(名前、アイコン、作成者、データファイル、共有ライブラリなど)を指定するために使用されます。

  3. 実行:python setup.py py2exe

また、「Inno Setup」ソフトウェアを使用してインストーラーを作成しています。ショートカットの作成、環境変数の設定、アイコンなど...


py2exeは何年も更新されていません。私は見つけることができません任意の最近の活動を。私はその時、それは維持されていないと思います。(また、Python <3.4のみをサポートします。つまり、非推奨のPythonバージョンのみをサポートします)。
Legorooj


-1

他の回答にはないので、まったく別の側面を1つ追加します。

ユニットテスト。または一般的なテスト。

通常、1つの既知の適切な構成を使用することをお勧めします。プログラムの依存関係によっては、パッケージのさまざまな組み合わせをテストしなければならない場合があります。たとえばtox、CI / CDパイプラインを使用して、またはその一部として自動化できます。

テストするパッケージの組み合わせに関する一般的な規則はありませんが、通常はpython2 / 3の互換性が大きな問題です。メジャーバージョンが異なるパッケージに強い依存関係がある場合は、これらの異なるバージョンに対するテストを検討することをお勧めします。


これは、ソフトウェア開発の非常に重要な側面です。しかし、これは完全に質問に答えることに失敗します。単体テストはプログラムの配布にどのように役立ちますか?
Legorooj

私見、OPは配布について具体的に尋ねていません。彼は他の人が彼のプログラムを実行できることを確認する方法を尋ねます。人々が使用できるパッケージのセットに制限されているかもしれないので、ユニットテストは実際にそれを行うのを助けることができると思います。一般に、配布の質問は重要です(ここで回答されています)が、実際のシナリオでは、単一のパッケージだけでvenv全体を作成することはできません。少なくともいくつかの標準構成と互換性がある必要があります。
Dschoni

単体テストが正しく実行されることを確認する上で貴重であることに異議はありませんが、OPは「インストールが簡単」な方法でコードを共有する方法を尋ねました。これが、この特定の質問については、これは無効な回答だと思う理由です。
Legorooj

それでも問題は流通だけではないと思います。だから私はこの答えを追加しました。Windowsなどで開発する場合、配布前に実行することを確認するには、Unixでのテストが不可欠です。
Dschoni

好奇心から、今言ったこととどう違うの?... making sure it runs correctly ...?テストは、正しく動作することを確認するための重要な部分です。したがって、テストは配布の準備の重要な部分ですが、実際に配布することとは何の関係もありません
Legorooj

-1

選択可能なpythonパッケージに関して、既存の利用可能なソリューションのいくつかの非常に短い要約を提供します(知識は力です):

  1. Structuring Your Projectで提供されているガイドラインに従ってください。これらの規則はPythonコミュニティで広く受け入れられており、通常、新規参入者がPythonでコーディングを開始するときの出発点として適しています。これらのガイドラインに従うことで、githubまたは他の同様の場所でプロジェクト/ソースを監視しているpythonistは、それをインストールする方法をすぐに知ることができます。また、プロジェクトをpypiにアップロードしたり、これらのルールに従ってCIを追加したりするのも簡単です。

  2. プロジェクトが標準の規則に従って適切に構造化されたら、次のステップは、使用可能なフリーザーの一部を使用することです。エンドユーザーに、Pythonを強制的にインストールせずにインストールできるパッケージを出荷する場合に備えます。マシン。これらのツールはコード保護を提供しませんが、そうではないことに注意してください...そうでなければ、最終的なアーティファクトから元のpythonコードを抽出することは、すべての場合に簡単です。

  3. devの依存関係を強制的にインストールせずにプロジェクトをユーザーに出荷したい場合は、コード保護にも注意して、既存のフリーザーを考慮したくない場合は、nuitkashedskincythonまたは類似のもの。通常、これらのツールによって生成されたアーティファクトからコードを逆にすることは簡単ではありません...一方、クラッキング保護は別の問題であり、物理バイナリをエンドユーザーに提供しない限り、多くのことはできませんそれらについて遅くすること以外にそれについて:)

  4. また、Pythonプロジェクトで外部言語を使用する必要がある場合は、https://wiki.python.org/moin/IntegratingPythonWithOtherLanguagesのようなもう1つの古典的なリンクが考えられますこのようなツールのビルドシステムをCIに追加するには、次のようにします。 1のルールはかなり簡単でしょう。

とはいえ、箇条書き1に固執することをお勧めします。これは、開始するのに十分以上のことであり、その特定のポイントは、Pythonの「標準」プロジェクトの既存のユースケースの多くをカバーするはずです。

これは完全なガイドとなることを目的としたものではありませんが、Pythonプロジェクトをすぐに大衆に公開することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.