2017-04-04 10 views
-1

私はPythonスクリプトを書いたばかりです。私はそれを使用できるように、私は友人に送信したいと思います。テキストファイル全体を送信し、それを実行する方法を教えるだけでなく、ソースコードにアクセスできるようにするのではなく、今までに実行できる「プログラム」としてパッケージ化する方法を考えていました彼らはコード自体にアクセスすることなく、彼らが望む。pythonスクリプトを実行可能ファイルとして送信

さらに、私は何を探していますか?これを行う方法についての説明が役に立ちますが、正確な情報を得るために何を探すことができるのかを知りたいと思っています。

また、これはUNIXマシンからUnixマシンになります。

+1

Unixのは、Pythonが付属しています:あなただけの1つのファイルを使用する場合は

if __name__ == '__main__': from shutil import copy os.chdir('src') programs = [f for f in os.listdir('.') if f.endswith('.py')] for pyfile in programs: name = pyfile[:-3] mkarchive(name, 'spam', pyfile) copy(name, '../'+name) os.remove(name) 

:次のコードは、3つの実行ファイルのアーカイブ、eggshamfooを作成します。依存関係がない場合は、.pyファイルを実行可能にして、ハッシュ・バングを追加して送信してください。 – jonrsharpe

+1

実行方法を教えたくなければ、忍耐強く待って勉強してください。 –

+0

@jonrsharpe通常、パッケージ化は単純ではありません。依存性がゼロで、ターゲットマシンのPythonバージョンが互換性があることが分かっている場合を除きます。より良い方法は、 'setup.py'ファイルを作成して配布を作成することです。 – wim

答えて

1

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.pyham.pyfoo.py)。また、サブディレクトリspamが含まれています。このサブディレクトリには、すべてのスクリプトで使用されるPythonモジュールが含まれています。

if __name__ == '__main__': 
    mkarchive('scriptname', None, 'filename.py') 
+0

okありがとう、ありがとう!これに関する2つの質問。スクリプト全体はGradeCalculator.pyと呼ばれる単なるファイルです。この場合は、__name__ == '__main__'の場合はmkarchiveで始まる行が必要ですか?それとも省略することができますか? (その行はスパムのサブディレクトリに関連しているように見えますが、私の場合は余分なサブディレクトリはありません)。私はたぶん私のスクリプトのシンプルさについて言及していたはずです。 2番目の質問は、「パス」(コードの最初のブロックチャンクの最後の行)を省略しますか? – Edany416

+0

更新された回答を参照してください。 –

+0

オハイオ州オハイオ州私は今起こっていることを見る。ありがとうございます – Edany416

関連する問題