2

私は、Jira API と通信する必要がある Python プロジェクトに取り組んでいます。ここで入手できる「公式」の Python 用 Jira クライアントを使用したいと考えています。

このパッケージは、グローバルな名前空間jiraを導入します。つまり、

from jira import JIRA

API を使用する。

サブパッケージを作成する方法

company.project.datasources.jira

グローバルjiraパッケージをシャドウイングせずに?


問題を再現し、私が考えていることを示すために、いくつかの手順を追加しましょう。

これは私のディレクトリレイアウトです:

.
├── company
│   ├── __init__.py
│   └── project
│       ├── datasources
│       │   ├── __init__.py
│       │   └── jira.py
│       └── __init__.py
└── test.py

会社/プロジェクト/データソース/jira.py

# This should be the global class. I don't know how to import it
from jira import JIRA as BaseJira

class JIRA(BaseJira):
    # Add something fancy here
    pass

test.py

from company.project.datasources.jira import JIRA

custom_jira = JIRA()

私がしようとすると:

python test.py

次のエラーが表示されます。

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from company.project.datasources.jira import JIRA
  File "/tmp/test/company/project/datasources/jira.py", line 2, in <module>
    from jira import JIRA as BaseJira
ImportError: cannot import name JIRA

__init__.py現在、すべて空のファイルです。私はそれらで多くのことを試しましたが、うまくいきませんでした。おそらく、これらのファイルは私の問題の鍵ですか?

4

1 に答える 1

4

Python 2 を使用していますが、インポートの解決方法に問題があります。jiraは現在のモジュールに関連するモジュールを参照すると考えられjiraます (この場合、それらは同じものを参照しますが、これは、 の隣にある別のモジュールからこのインポートを実行しようとした場合にも発生しますjira.py)。

Python 3 のインポート動作を有効にする必要があります。次のインポートを、他のものjira.py(またはシャドウされたパッケージが表示される同じレベルの他のもの) の前に追加します。

from __future__ import absolute_import

詳細については、 PEP 328を参照してください。要約では、一般的な問題について説明しています。

インポートは、パッケージに直面してあいまいになる可能性があります。import fooパッケージ内では、パッケージ内のモジュールを参照するのか、パッケージ外のモジュールを参照するのかは明確ではありません。(より正確には、ローカルのモジュールまたはパッケージは、直接ぶら下がっている別のモジュールをシャドウできますsys.path。)

sys.pathパッケージ相対インポートにアクセスするための特別な構文 (先頭のドット) を使用して、すべてのインポート ステートメントをデフォルトで絶対 (検索のみ) にすることが提案されています。

于 2015-06-12T19:51:48.947 に答える