2016-03-08 8 views
7

私はファイルを処理する必要があるこのpythonものがあります。Pythonプロジェクトを構築するための非常に簡単な方法は何ですか?

まずそれがだった:

my_project/ 
├── script.py 

そして、私は単にpython script.py file.csvでそれを実行します。

は、それが成長し、なった:

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

(すべてのディレクトリに空__init__.pyがあります)

しかし、今my_service.pystring_util.pyを使用したいと、それはそうですこれをうまくやり遂げる方法は簡単ではありません。

私は(from services import my_servicescript.pyにインポートされます)my_service.pyfrom ..util import string_utilをしたいだろうが、それはmy_serviceさん__name__以来python script.pyでは動作しないことのみservices.my_serviceである(と私はを取得しますAttempted relative import beyond toplevel package

  • 私が行うことができますcd ..python -m my_project.scriptしかし、それは非常に不自然に思え、これを実行する方法についてはREADMEに記載するのが本当に悪いです。

  • 今、私は醜いsys.path.append()ハックで解決しています。

その他のオプションはありますか?

+0

私はこれに私のテイクを共有することができますが、答えとして投稿されます。私はあなたの考えを知っています。 – idjaw

答えて

2

これは意見に接していますが、私はこのことを分かち合います。

あなたのプロジェクトを別の方法で見てください。 1つの実行ポイントを選択し、そこからインポートを参照し、回避しようとしている奇妙な相対インポートをすべて避けます。だから、あなたのプロジェクト構造を見て:あなたは、現在行っていると

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

は、my_projectの中から、あなたのコードを実行します。そのようにして、すべての輸入品でなければなりません。したがって、あなたの輸入は実際にこのようになります。これを考える

# my_service.py 

from util.string_util import foo 

別の方法を、あなたの周りのあなたのプロジェクトを移動する場合ということである、またはCIを持っている、あなたは、プロジェクトのルートが何であるかを指定することを確認する必要がありますあなたはから実行したいです。これらのことを念頭に置いて、プロジェクトを実行する場所の単一の実行ポイントを指定すれば、パッケージやモジュールを構造化して適切に参照することで、他のシステムがプロジェクトを適切に使用できるようになります奇妙な相対輸入に対処する必要はありません。

これが役に立ちます。

+0

うわー、これは実際に私には全く起こりませんでした。それはとても簡単です。ですから、 '..util import string_util'から' ..'を削除するだけで、すべてがクールです。 (私がここで絶対輸入で涼しいなら、それは私です。) それは確かに助けをします。ありがとう! – Bloke

関連する問題