Ошибка ввода / вывода: невозможно открыть ресурс при импорте файла python из другого каталога - PullRequest
2 голосов
/ 22 марта 2012

Я генерирую PDF, используя ReportLab.Но когда я пытаюсь прикрепить изображение, оно выдает ошибку.Если я не включаю изображение, тогда все в порядке.код работает успешно.

У меня следующая структура каталогов.

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) или я импортирую файлы неправильно?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

5 голосов
/ 22 марта 2012

Все операции файловой системы относятся к текущему рабочему каталогу , который не связан с тем, в каком модуле Python вы находитесь.

В 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)
2 голосов
/ 22 марта 2012

Ваш путь должен быть относительно файла, который вы фактически запускаете, а не модулей, которые вы импортируете.

Итак, вам нужно либо изменить путь к изображению на 'childDir / image.jpg'укажите полный путь (или определите его динамически) или передайте путь изображения в качестве аргумента импортируемой функции.

...