2

SOへの最初の投稿なので、詳細が欠けている場合はご容赦ください。

os 経由で sys.path を変更することなく、別のサブフォルダーからの相対パスを使用する方法はありますか? 最終的にこれは cgi Web サーバーから実行されるので、python.exe への -m 引数は避けたいと思います。

私はPython 2.7.3を使用しており、次のファイル/ディレクトリ構造を持っています:

|   myprog.py
|
+---functions
|       myfunctions.py
|       __init__.py
|
\---subfolder
        mysub.py

ルートには、 myprog.py という .py ファイルが 1 つあります。

#file .\myprog.py

from functions import *
hello("Hi from Main")

functions フォルダーには、init .py、myfunctions.pyの 2 つのファイルがあります。

#The File: functions\__init__.py :
from myfunctions import *

#The File: functions\myfunctions.py :
def hello(sometext):
   print sometext

最後に、サブフォルダーには次のものがあります。

#The File: subfolder\mysub.py :

from ..functions import *
hello("Hi From mysubprogram")

myprog.py は正常に実行され (親フォルダーから python.exe myprog.py を実行した場合)、「Hi From Main」と出力されますが、mysub.py (サブフォルダーから実行された場合) はエラーを出し続けます: ValueError: Attempted relativeノンパッケージで輸入

from ..functions.myfunctions import * など、mysub.py でさまざまな組み合わせを試しましたが、目的の結果が得られません。

私はいくつかの関連記事を読みました:
using __init__.py __init__.py
で定義されたクラスをインポートする方法
http://docs.python.org/2/tutorial/modules.html#packages-in-multiple-directories

しかし、これだけではわかりません。ああ、これが機能したら、可能な限り import * を削除したいと思いますが、呼び出されるたびに hello 関数へのフルパスを入力する必要はありません。 init.py を (すべてまたは別の方法で) クリーンアップすると、おまけになります。

Blckknght EDIT に感謝します。以下も見つかりました: 10 億回目の相対インポート

私が要求していることが不可能である場合、おそらく私は間違ったことを求めています. これが完全に悪い習慣である場合、sys.pathを使用して私の目標を達成する正しい方法ですか、それとも誰かが推奨できるものがありますか(../foldersから関数を呼び出さないなど)?

4

1 に答える 1

1

mysub.py問題は、スクリプトの実行方法に関係していると思います。__main__メイン スクリプト モジュールは通常の名前ではなく常に名前が付けられるため、Python はパッケージ内のスクリプトをうまく処理できない傾向があります。

mysubで実行するか、変数をpython -m subfolder.mysub操作することでこれを修正できると思います( PEP 366で説明されているように)。残念ながらきれいではありません。__package__mysub.py

于 2013-07-14T19:14:41.930 に答える