6

他のPythonスクリプトで使用および参照される再利用可能なコードを含むPythonスクリプトがかなりの数あります。ただし、これらのスクリプトはさまざまなディレクトリに分散している傾向があり、最上位のスクリプトにsys.path.appendへの(ほとんどの場合複数の)呼び出しを含める必要があるのはやや面倒です。同じスクリプトに追加のファイル参照を追加せずに、「import」ステートメントを提供したいだけです。

現在、私はこれを持っています:

import sys
sys.path.append('..//shared1//reusable_foo')
import Foo
sys.path.append('..//shared2//reusable_bar')
import Bar

私の好みは次のとおりです。

import Foo
import Bar

私のバックグラウンドは主に.NETプラットフォームであるため、ソースファイルの外部にある実際のファイルパス参照を管理および含めるために、*。csproj、*。vbproj、*。slnなどのメタファイルを使用することに慣れています。これにより、すべての参照を公開せずに、「using」ディレクティブ(Pythonのインポートに相当)を提供し、複数のスクリプト間でパス参照自体を再利用できるようになります。

Pythonはこれを同等にサポートしていますか?そうでない場合、いくつかのテクニックとアプローチは何ですか?

4

6 に答える 6

4

簡単な答えは、sys.path にある site-packages ディレクトリに再利用可能なコードを配置することです。

パスのどこかに .pth ファイルを追加して、検索パスを拡張することもできます。詳細については、 https://docs.python.org/2/install/#modifying-python-s-search-pathを参照してください

ああ、そして python 2.6/3.0 は、PEP370、ユーザーごとのサイトパッケージディレクトリのサポートを追加します

于 2008-11-13T19:02:41.780 に答える
3

再利用可能なファイルがパッケージ化されている場合 (つまり、__init__.pyファイルが含まれている場合)、そのパッケージへのパスが PYTHONPATH または sys.path の一部である場合は、次のようにするだけで済みます。

import Foo

この質問は、さらにいくつかの詳細を提供します。

(注: Jim が言ったように、再利用可能なコードをsite-packagesディレクトリにドロップすることもできます。)

于 2008-11-13T19:02:27.523 に答える
1

あるプロジェクトでは、ユーザーが (基本的にはプラグインとして使用できる) Python スクリプトをどこにでも配置できるようにしたいと考えていました。私の解決策は、そのプロジェクトの構成ファイルに以下を入れることでした:

[server]
PYPATH_APPEND: /home/jason:/usr/share/some_directory

そうすれば、プログラムの起動時に /home/jason と /usr/share/some_directory が Python パスに追加されます。

次に、文字列をコロンで分割し、それらのディレクトリを sys.path の最後に追加するだけです。その構成ファイルを読み取り、それらのディレクトリを sys.path に追加する機能を含むモジュールを site-packages ディレクトリに配置することを検討することをお勧めします (残念ながら、現時点では例を書く時間がありません)。 .

他の人が述べたように、できるだけサイトパッケージに入れ、.pth ファイルも使用することをお勧めします。しかし、これは、他のスクリプトからインポートしたくない、サイト パッケージに含まれていない大量のものをインポートする必要があるスクリプトがある場合には良い考えです。

(.pth ファイルを使用してこれを行う方法もあるかもしれませんが、残りの構成情報を配置するのと同じ場所で python パスを操作できるのが好きです)

于 2008-11-13T20:27:56.273 に答える
1

再利用可能なものを中に入れることができますsite-packages。デフォルトで入っているので、これは完全に透過的sys.pathです。

someName.pthにファイルを入れることができますsite-packages。これらのファイルには、実際の再利用可能なものが存在するディレクトリがあります。これも完全に透明です。に変更をインストールする余分な手順は必要ありませんsite-packages

再利用可能なもののディレクトリを置くことができますPYTHONPATH。設定されていることを確認する必要があるため、これは少し透明性が低くなります。ロケット科学ではありませんが、完全に透明ではありません。

于 2008-11-13T20:15:37.267 に答える
1

最も簡単な方法は、PYTHONPATH を設定 (または追加) し、モジュールとパッケージを PYTHONPATH に含まれるパスに配置 (またはシンボリック リンク) することです。

于 2008-11-14T00:43:32.980 に答える
0

私の解決策は、モジュールをインポートする 1 つのユーティリティをパッケージ化することでした: my_util はサイト パッケージにあります。

import my_util

foo = myutil.import_script('..//shared1//reusable_foo')
if foo == None:
    sys.exit(1)


def import_script(script_path, log_status = True):
    """
    imports a module and returns the handle
    """
    lpath = os.path.split(script_path)

    if lpath[1] == '':
        log('Error in script "%s" in import_script' % (script_path))
        return None


    #check if path is already in sys.path so we don't repeat
    npath = None
    if lpath[0] == '':
        npath = '.'
    else:
        if lpath[0] not in sys.path:
            npath = lpath[0]

    if npath != None:
        try:
            sys.path.append(npath)
        except:
            if log_status == True:
                log('Error adding path "%s" in import_script' % npath)
            return None

    try:   
        mod =  __import__(lpath[1])
    except:
        error_trace,error_reason =  FormatExceptionInfo()
        if log_status == True:
            log('Error importing "%s" module in import_script: %s' % (script_path, error_trace + error_reason))
        sys.path.remove(npath)
        return None

    return mod
于 2008-11-14T01:08:06.723 に答える