次のディレクトリ構造があります。
\something\python\
extras\
__init__.py # empty file
decorators.py # contains a benchmark decorator (and other things)
20131029\ # not a package, this contains the scripts i use directly by doing "python somethingelse.py"
somethingelse.py
そして今、私は次のようなことができるようになりたいです
from .extras import decorators
from decorators import benchmark
somethingelse.py の中から
これが機能するには、どこにファイルを配置する必要がありますか__init__.py
(現時点では、「\something\python\」パスが .tchsrc に追加されます)。
今、私は次のエラーが発生します:
from .extras import decorators
ValueError: Attempted relative import in non-package
これは私の pythonpath に追加する際の問題ですか? またはどうすればこれを解決できますか?私が持っている現在の回避策は、作成した新しいディレクトリごとに decorators.py をコピーペーストすることです (「20131029」のような新しいバージョンのコードを作成する場合)。コードの新しいバージョンを作成するたびに多くのものがあるため、正しいインポートを備えたよりエレガントなバージョンが必要です。
注: 私は python 2.7 で作業していますが、違いがある場合は?
編集:はい、実行して実行します
python somethingelse.py
詳細編集: ベンチマーク デコレータの定義方法が重要かどうかわかりませんか? (クラスとかではないです、次はまさにdecorators.pyファイルから出てきます)
import time, functools
def benchmark(func):
"""
A decorator that prints the time a function takes
to execute.
"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
t = time.time()
res = func(*args, **kwargs)
print func.__name__, time.time()-t
return res
return wrapper
編集: \something\python\extras\ を pythonpath に入れると、
ImportError: No module named decorators
私が実行するとき:
from decorators import benchmark
これは、その extras-directory 内に別のサブディレクトリを作成する必要があることを意味しますか?
編集: .tchsrc に、次の行を追加しました。
setenv PYTHONPATH /bla/blabla/something/python/extras/
そして、somethingelse.pyで、次を実行すると:
import sys
s = sys.path
for k in s:
print k
パス /bla/blabla/something/python/extras/ がそのリストにあることがわかりましたが、なぜ機能しないのかわかりませんか?