Pythonは実行可能なアーカイブをサポートしています。これは、プログラムとモジュールの束を1つのファイルにまとめる方法です。たとえば、youtube-dl
はこのように配布されます。
「実行可能ファイル」は、基本的には、ちょうど#!
行が先頭にあるzipファイルです。だから知識のある人はまだソースコードを手に入れることができます。
Makefile
では、UNIXの場合はzip
を使用して簡単に作成できます。 しかし、これは簡単ではないプラットフォームもあります。そこで私はbuild.py
と呼ばれるPython専用のソリューションを構築しました。
"""Create runnable archives from program files and custom modules."""
import os
import py_compile
import tempfile
import zipfile as z
def mkarchive(name, modules, main='__main__.py',
shebang=b'#!/usr/bin/env python3\n'):
"""Create a runnable archive.
Arguments:
name: Name of the archive.
modules: Module name or iterable of module names to include.
main: Name of the main file. Defaults to __main__.py
shebang: Description of the interpreter to use. Defaults to Python 3.
"""
std = '__main__.py'
if isinstance(modules, str):
modules = [modules]
if main != std:
try:
os.remove(std)
except OSError:
pass
os.link(main, std)
# Forcibly compile __main__.py lest we use an old version!
py_compile.compile(std)
tmpf = tempfile.TemporaryFile()
with z.PyZipFile(tmpf, mode='w', compression=z.ZIP_DEFLATED) as zf:
zf.writepy(std)
for m in modules:
zf.writepy(m)
if main != std:
os.remove(std)
tmpf.seek(0)
archive_data = tmpf.read()
tmpf.close()
with open(name, 'wb') as archive:
archive.write(shebang)
archive.write(archive_data)
os.chmod(name, 0o755)
if __name__ == '__main__':
pass
これは変更されていないはずではありません。
build.py
をプロジェクトにコピーします。次にin __name__ == '__main__'
の後に、次の例に基づいてパーツをカスタマイズします。
ディレクトリsrc
に複数のPythonファイルが含まれているとします(eggs.py
、ham.py
、foo.py
)。また、サブディレクトリspam
が含まれています。このサブディレクトリには、すべてのスクリプトで使用されるPythonモジュールが含まれています。
if __name__ == '__main__':
mkarchive('scriptname', None, 'filename.py')
Unixのは、Pythonが付属しています:あなただけの1つのファイルを使用する場合は
:次のコードは、3つの実行ファイルのアーカイブ、
eggs
、ham
とfoo
を作成します。依存関係がない場合は、.pyファイルを実行可能にして、ハッシュ・バングを追加して送信してください。 – jonrsharpe実行方法を教えたくなければ、忍耐強く待って勉強してください。 –
@jonrsharpe通常、パッケージ化は単純ではありません。依存性がゼロで、ターゲットマシンのPythonバージョンが互換性があることが分かっている場合を除きます。より良い方法は、 'setup.py'ファイルを作成して配布を作成することです。 – wim