Pythonアプリケーションのソースコードを保護する方法

遅かれ早かれ、すべてのpython開発者は選択を迫られます。ソースのアプリケーションを顧客に提供するか、非表示にします。 そして2番目のケースでは、多くの人(特に最近この美しい言語に精通している人)に問題があります。Google検索では、原則として、何も、まったくアイデアがありません(またはすべてがおかしい)。



そして、この場合に何をすべきか?



私の最初の考えは、pycファイルを配布することでした。 それから私はまだそれが本当に何であるかを詳しく調べていません。 これが脅すよりも数時間答えを探した後、唯一の可能な結論が下されました:オプションは機能しません。 Python <2.7の場合、「逆コンパイラ」は完全に無料であり、ソースコードの形式で比較的少ないお金で2.7以上を提供することを約束します。 はい、このツールを使用して 、すぐに1対1のコードを受け取りました。



バイナリのビルドオプションは非常に魅力的でした。 結局のところ、すべてのコレクター(以下でcx_Freezeの例を挙げます)は、実際に.pycをアーカイブにパックすることだけを行います。つまり、ソースコードを絶対に保護しません。



そして、それは私に夜明けをもたらしました。



このような構造のプロジェクトプロジェクトを提供します(これは単なる例です)。



TestModule/__init__.py

TestModule/Config.py

ui/__init__.py

ui/mainwindow.py

ui/loginwindow.py

main.py







ここで、私はすぐに2つの点に注意したいと思います。

  1. main.pyファイルでは、実際にはメインモジュールへの呼び出しのみが必要です。さらに何かがある場合は、これを別のモジュールに配置することをお勧めします
  2. __Init__.pyファイルは空であることが望ましいです。




いくつかの簡単な操作を行います。

  1. $ sudo apt-get install cython



  2. プロジェクトルートにcompile.pyファイルを作成します。

     from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [ Extension("TestModule.Config", ["TestModule/Config.py"]), Extension("ui.mainwindow", ["ui/mainwindow.py"]), Extension("ui.loginwindow", ["ui/loginwindow.py"]), ] setup( name = 'Test App', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules )
          
          





  3. 同じ場所(プロジェクトのルート)で実行します

    $ python compile.py build_ext --inplace



  4. * .soおよび__init__.pyを除くサブディレクトリ内のすべてのファイルを削除できるようになりました




パフォーマンスを確認した後、すべてが以前とまったく同じように動作するはずです。

これですべて、誰もソースコードを読むことができなくなります。 お客様が使用したすべてのモジュールでpythonをインストールおよび構成することを望まないため、アプリケーションを提供するのは時期尚早であることは事実です。 したがって、すべてを「パッケージ」に収集します。

  1. $ sudo apt-get install cx-freeze



  2. プロジェクトのルートで、pack.pyファイルを作成します。

     from cx_Freeze import setup, Executable setup( name = "Test App", version = "0.1", description = "test", executables = [Executable("main.py")])
          
          



  3. $ python pack.py build



  4. プロジェクトフォルダから「your」フォルダをコピーしてbuild / exe.linux-x86_64-2.7を作成します
  5. 結果のバイナリを実行し、必要に応じて、不足しているライブラリをコピーします(私の場合はPyQtでした)




確認後、パッケージを顧客に渡すことができます。



PSこのシンプルなハウツーが、私を救うためにできるだけ多くの時間を節約してくれることを願っています。



All Articles