2

以前の回答を調べたところ、使用できるはずだと思われるものは次のとおりです。

from .. import code

これは生成されますが: ValueError: Attempted relative import beyond toplevel package

これは機能していないようですが。私のファイル構造は次のとおりです。

scraper/
    __init__.py
    bot/
            scraper.py
            __init__.py
            wigan/ 
                    council.py
                    __init__.py

以下を使用して、スクレーパーロードカウンシルから実行できます。

from wigan import council

評議会からですが、scraper.py を読み込もうとすると、次のいずれも機能しません。

from .. import scraper
from scraper.bot import scraper
from scraper.bot.scraper import scraper

どんな助けでも素晴らしいでしょう。ありがとう :-)

4

1 に答える 1

0

あなたが抱えている問題は、パッケージにあるスクリプトを実行していることだと思います。これは、Python で最もぎこちなくサポートされている機能の 1 つです。スクリプトを直接実行すると、現在のパスが Python 検索パスの先頭に配置されます。ただし、パッケージの中にいる場合、これは間違っています。

適切に実行するにはscrapper.py(それがスクリプトの場合)、最上位のフォルダー ( の上にあるもの) に変更してから、 を実行する必要がありscrapper/ますpython -m scrapper.bot.scrapper

PYTHONPATHまたは、環境変数を使用するか、フォルダー (または適切な.pthファイル) をフォルダーにインストールすることによって、最上位フォルダーを Python 検索パスに追加するとsite-packages、現在のディレクトリの制限が緩和され、スクリプトを実行できます。どこからでも。

モジュールを他のモジュールから名前でインポートする場合、モジュールをスクリプトとして実行することには別の問題があります。__main__スクリプトは、実際の名前ではなく、としてインポートされます。名前でもインポートすると、スクリプトの 2 番目のコピーが取得されます。つまり、意図したとおりに機能しない可能性があります (モジュールにグローバルな状態がある場合、コピー間で一貫性がない可能性があります)。これが、スクリプトができる限り少ない作業を行うようにしばしば提案される理由の 1 つです (別のモジュールから何かをインポートして実行するだけです)。これを行うためにコードをリファクタリングすることもできます。

于 2013-04-08T19:48:37.030 に答える