0

この質問は以前にもあったかもしれませんが、見つけられませんでした。

私はLinuxボックスを使用しています。/avt というフォルダーから実行される py アプリがあります。(例) このコードは私が書いたものではなく、それに付随する約 12 個のモジュールがあります。私はこの混乱を受け継いだ幸運なエンジニアでした。このアプリは、このディレクトリ /avt/bin の下にある他のモジュールをインポートします。現在の作業ディレクトリがどこにあるかに関係なく、/bin ディレクトリでモジュールを見つけられるようにしたいと考えています。場合によっては、アプリがディレクトリを他のサブフォルダーに変更して、ファイル I/O を実行することがあります。その後、戻る必要がありますが、コードが「そのようなファイルまたはディレクトリはありません」というエラーでエラーになるため、戻ってこない場合があるようです。そのため、/bin ディレクトリへのファイル I/O を行う前に、毎回作業ディレクトリをテストしたいと考えています。例として、/bin にファイルを作成し、後でそれらのファイルを開いてデータを読み取りたいと考えています。現在の作業ディレクトリが常に /avt であることを確認するにはどうすればよいですか? そうでない場合は、ch.dirに移動しますか?注: また、任意の Linux マシンの任意のディレクトリ構造で実行する必要がある場合は、移植可能なコードである必要があります。

このコードを試してみましたが、あまりきれいではないと思います。Python は私のメイン言語ではありません。このコーディングは適切で、これで機能しますか? このフォーラム用にフォーマットする方法がわかりません。

Avtfolder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
if Avtfolder not in sys.path:
    sys.path.insert(0, Avtfolder)

if Avtfolder.__contains__('/avt'): 

    modfilespath = Avtfolder + '/bin'
    print 'bin dir is ' + modfilespath
else:
    print 'directory lost...'
#write some code here that changes to the root /avt dir 
4

1 に答える 1

1

いくつかメモがあります。

まず、2つの問題が混同されているのではないかと思います(または、どちらの問題に直面しているのかわかりませんでした)。これらの問題は次のとおりです。

  1. 異なるマシン上の異なるディレクトリに存在できるファイルへのI/O
  2. アプリで使用されるPythonモジュールをインポートします。これは、わずかに異なる場所にある場合もあります。

質問のタイトルと一部のテキストは、問題2を処理していることを示していますが、I / Oおよび「そのようなファイルまたはディレクトリがありません」というエラーへの参照は、問題1を示しています。

ただし、これらは個別の問題であり、個別に扱われます。私は両方の正確なレシピを与えることはできませんが、ここにいくつかの提案があります:

問題1の場合:ユーザーがPythonライブラリをインストールするフォルダーでI / Oを実行したり、ファイルを作成したりするのは良い考えではないと思います。これはPythonモジュール用のフォルダーであり、データではありません。また、ライブラリが、を使用して、またはsetup.pyを使用してインストールされている場合(現在そうでない場合は、将来変更される可能性があります)、として呼び出されない限り、プログラムはおそらくそこに書き込むための十分な権限を持っていません。そしてそうです。別の場所にファイルを作成します。pipeasy_installroot

「ディレクトリの変更を追跡する方法」の部分について:私はあなたが何を意味するのか完全には理解していないことを告白しなければなりません。なぜ「現在のディレクトリ」の概念を使用しているのですか?私の考えでは、、などの変数があればwrite_pathdata_pathコードは次のようになります。

data = open(os.path.join(data_path, 'data.foo'))
dump = open(os.path.join(write_path, 'dump.bar'), 'w')

なぜあなたはあなたの図書館がどこにあるかさえ気にするのですか?私はそれが正しいとは思わない、私はそれを変えるだろう。これinspect.currentframe()は、ライブラリのデザインを本当に再考する必要があるようなにおいがします。

ここで、ライブラリの場所が重要なのは問題2です。しかし、繰り返しになりますが、絶対パスは重要ではありません(問題がある場合は、それを変更してください!)。すべてのモジュールが1つのフォルダー(またはそのサブフォルダー)内にある必要があるだけです。それらが同じフォルダにある場合は、問題ありません。import fooうまくいくでしょう。一部がサブフォルダーにある場合、それらのサブフォルダーには名前が付けられたファイルが含まれている必要があります__init__.py。そうすると、Pythonインタープリターによってモジュールとして認識されるため、を実行できるようになりますfrom foo import bar。ここfooで、はサブフォルダーと__init__.pyそのbar.py中にあります。

.pyしたがって、ファイルの場所に依存しないように書き直してみてください。本当にそこを使う必要はまったくないはずですinspect。別の注意点として、__contains__本当に必要な場合を除いて、直接のような特別な方法を使用しないでください。if '/avt' in Avtfolder同じことをします。

于 2012-06-07T21:11:52.330 に答える