0

Pythonでライブラリを次のようにセットアップしています。

library
  | - __init__.py
  | - lib1.py
  | - ...
  | - tools
        | - __init__.py
        | - testlib1.py

つまり、ディレクトリlibraryには python モジュールが含まれtoolsており、ディレクトリにはサブディレクトリが含まれており、たとえば、ライブラリをテストするためのlibrary1 つのファイルが含まれています。testlib1.pylib1.py

testlib1.pyしたがって、ファイルが検索パスにあると仮定して、コンピューターのどこかからlib1.py呼び出すだけで、いくつかのテストなどを行うために上記のディレクトリからインポートする必要があります。python testlib1.pyまた、ONEだけPYTHONPATH指定してほしいです。

testlib1.pyしかし、相対インポートが機能しないため、次のアイデアが機能しないことは誰もが知っています。

from .. import lib1
...
do something with lib1

私は2種類の答えを受け入れます:

  1. testlib1.py実行中のPythonスクリプトとして直接呼び出すことができる方法を説明する回答。
  2. projectすべてがディレクトリにある必要があり、ツールは実際のライブラリとは異なるディレクトリにある必要があるという前提で、モジュールなどのより良い概念的なセットアップを説明する回答。

不明な点がある場合は、質問することをお勧めします。質問を更新します。

4

3 に答える 3

0

できません。相対インポートを使用する場合は、モジュールを単独で実行することはできません。相対インポートをドロップするか、testlib1.py直接実行するという考えをドロップします。

また、テスト ファイルで相対インポートを使用するべきではないと考えています。テストでは、ライブラリが機能するかどうかを確認する必要があります。したがって、コードは、ユーザーが実際に使用するコードにできるだけ似ている必要があります。通常、ユーザーはライブラリにファイルを追加して相対インポートを使用するのではなく、絶対インポートを使用します。

ところで、あなたのファイル構成はあまりにも「Java 風」で、ソース コードとテストが混在していると思います。テストを行いたい場合は、次のようなものを用意してください。

project/
   |
   +-- src/
   |    |
   |    +--library/
   |    |     |
   |    |     +- lib1.py
   |    |     |
   |    |    #...
   |    +--library2/ #etc.
   |
   +-- tests/
        |
        +--testlibrary/
        |      |
        |      +- testlib1.py
        #etc

nosetestsテストを実行するには、この種のフォルダー構造を自動的に検索し、検索/テスト設定を変更するための多数のオプションを提供するようなツールを使用するだけです。

于 2013-02-05T12:49:48.927 に答える
0

実際、私は解決策を見つけました。

  1. 現在の実装で動作します
  2. に変更を加える必要はありませんPYTHONPATH
  3. 最上位ディレクトリをハードコーディングする必要なし

testlib1.pyのコードで実行します (テスト済み)。

import os
import sys
dirparts = os.path.dirname(os.path.abspath(__file__)).split('/')
sys.path.append('/'.join(dirparts[:-1]))

import  mylib1

これが非常にクリーンで簡単なソリューションであるかどうかは正確にはわかりませんが、ディレクトリから1レベル上のモジュールをインポートできます。ファイル)。

于 2013-02-05T18:27:33.797 に答える
0

ディレクトリに a__init__.pyを追加してみてください。tools相対インポートが機能するはずです。

于 2013-02-05T12:33:51.667 に答える