回答:
Python 2.6と3.xは、適切な相対インポートをサポートしているので、ハッキングを一切回避できます。この方法を使用すると、絶対インポートではなく相対インポートを取得していることがわかります。「..」は、私の上のディレクトリに移動することを意味します。
from ..Common import Common
警告として、これはパッケージの外側からモジュールとしてpythonを実行する場合にのみ機能します。例えば:
python -m Proj
この方法は、パッケージを実際に「インストール」することがない状況でも、依然として一般的に使用されています。たとえば、Djangoユーザーに人気があります。
Common /をsys.pathに追加できます(Pythonが物事をインポートするために調べるパスのリスト):
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
import Common
os.path.dirname(__file__)
現在のpythonファイルが置かれているディレクトリが表示されたら、「Common /」ディレクトリに移動して、「Common」モジュールをインポートします。
from ...myfile
に行く../../myfile
おかしなことに、私がちょうど出会った同じ問題、そして私はこの仕事を次の方法で得る:
Linuxコマンドln
と組み合わせると、物事をより簡単にすることができます。
1. cd Proj/Client
2. ln -s ../Common ./
3. cd Proj/Server
4. ln -s ../Common ./
そして、次のようにsome_stuff
file:Proj/Common/Common.py
からyour file:にインポートする場合はProj/Client/Client.py
、
# in Proj/Client/Client.py
from Common.Common import some_stuff
そして、に同じことが当てはまるProj/Server
。またのために働く、setup.py
プロセス、
同じ質問はここで議論し、それが役に立てば幸い!
相対インポートを行わないでください。
PEP8から:
パッケージ内インポートの相対インポートはお勧めしません。
すべてのコードを1つのスーパーパッケージ(「myapp」など)に配置し、クライアント、サーバー、および共通コードのサブパッケージを使用します。
更新: 「Python 2.6および3.xは適切な相対インポート(...)をサポートします」。詳細については、Daveの回答を参照してください。
if __name__ == "__main__":
'行の後のクライアントとサーバーの最後にコードを追加するとします。つまり、それらをスタンドアロンスクリプトとして使用できるようにする必要があります。それを正しく行う方法は?それはサポートされるべき完全に一般的なユースケースだと思います。なぜそれが推奨されないのですか?
相対インポートを行うことは絶対に大丈夫です!ここでは、ほとんど 'ol meが行います。
#first change the cwd to the script path
scriptPath = os.path.realpath(os.path.dirname(sys.argv[0]))
os.chdir(scriptPath)
#append the relative location you want to import from
sys.path.append("../common")
#import your module stored in '../common'
import common.py
__file__
、現在のファイルから適切な関係を取得するために使用されるため、より優れています
デフォルトのインポート方法は、PYTHONPATHからすでに「相対的」です。PYTHONPATHはデフォルトで、一部のシステムライブラリと元のソースファイルのフォルダーにあります。-mで実行してモジュールを実行すると、現在のディレクトリがPYTHONPATHに追加されます。したがって、プログラムのエントリポイントがProj内にある場合、使用import Common.Common
はServer.pyとClient.pyの両方で機能するはずです。
相対インポートを行わないでください。それはあなたがそれが望むように機能しません。