2012-03-22 11 views
2

ReportLabを使用してpdfを生成しています。しかし、私はそれに画像を添付しようとしているとき、それはエラーを与える。私がイメージを含んでいないなら、すべては問題ありません。コードは正常に実行されます。I/Oエラー:別のディレクトリからpythonファイルをインポート中にリソースを開くことができません。

私は以下のディレクトリ構造を持っています。

parentDir\ 
    main.py 
    childDir\ 
     __init__.py 
     first.py 
     second.py 
     image.jpg 

main.py

from childDir.first import methodOfFirst 

    #using methodOfFirst 

first.py

from second import methodOfSecond 

    #using methodOfSecond 

second.py

#this second.py file have **ReportLab** Code 
    ............. 
    canvas.drawImage('image.jpg', 0.2*inch, 11.12*inch, width=w*scale, height=h*scale) 
    ............. 

これは私のコードの基本骨格です。しかし、私が実行していたときに、それはエラーが発生します。

raise IOError('Cannot open resource "%s"' % name) 
IOError: Cannot open resource "tjsservices.jpg" 
    handle_pageBegin args=() 

私は、Pythonに新たなんだとReportLabのはとても階層のような種類をインポートするための正しい方法であるかわかりません。すべてのファイルが同じディレクトリにあれば正常に動作します。しかし、私はそのような種類のディレクトリ構造を使用しているとき、それは失敗します。

簡単にするために、私はこのスケルトンを提供しました。より多くのコードが必要な場合は教えてください。

質問があります。なぜこのエラーが発生しているのですか?これがReportLabの問題ですか(この種類のインポートはreportLabではサポートされていません)、またはファイルを間違ってインポートしていますか? ご協力いただければ幸いです。

答えて

4

すべてのファイルシステム操作は、あなたがにいるどのPythonのモジュールに関連していないcurrent working directory、に関連してい

second.pyでは、あなたがこのようなパスを計算することができます。

import os.path 
fn = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'image.jpg') 
canvas.drawImage(fn, 0.2*inch, 11.12*inch, width=w*scale, height=h*scale) 
+0

このような正確な回答は大変ありがとうございます。 –

2

をあなたのパスは、実際に実行しているファイルに相対的でなければならず、インポートしているモジュールではありません。

したがって、画像パスを 'childDir/image.jpg'に変更するか、フルパスを指定するか(動的に決定するか)、インポートされた関数の引数として画像パスを渡す必要があります。

+0

実際のコンセプトを理解するのに多くの助けになりました。答えは簡単です。 +1あなたは非常にThnak。 –

関連する問題