Python: как импортировать zip из другого каталога

Я развертываю некоторые сценарии Python в качестве веб-заданий Azure и столкнулся с проблемой импорта некоторых общих модулей (в виде zip-файлов). Все работает нормально, если я скопирую zip-файлы в тот же каталог, что и файл сценария. Но если я перемещу zip-файлы в другой каталог, все перестанет работать.

Теперь о специфике.

1) Это работает

Структура каталога:

App_data
  jobs
    continuous
      firstjob
        azure.zip
        job1.py
      secondjob
        azure.zip
        job2.py

В job1.py (и job2.py) я добавляю следующий код:

  sys.path.insert(0, 'azure.zip')
  from azure.storage.blob import *

1) Это НЕ работает

Структура каталога:

App_data
  pylib
    azure.zip
  jobs
    continuous
      firstjob
        job1.py
      secondjob
        job2.py

В job1.py (и job2.py) я добавляю следующий код: # Azure размещает скрипты на один уровень ниже, чем в решении, отсюда и дополнительные «..»!

  lib_path = os.path.realpath('..\..\..\pylib')
  sys.path.insert(0, os.path.join(lib_path, 'azure.zip'))
  # I verified by printing sys.path that the correct path is added for azure.zip
  from azure.storage.blob import *

Это дает ошибку импорта. Любые идеи?


person user2324268    schedule 31.01.2016    source источник
comment
Связанный: stackoverflow.com/questions/29783849/   -  person ivan_pozdeev    schedule 31.01.2016


Ответы (3)


Я проверил ваш код выше в моем локальном компьютере с помощью pycharm. Второй код также может работать хорошо. Я использую python3.5.0. Я не уверен, почему появляется ошибка. Возможно, проблема с версией Python в Azure. Надеюсь, это поможет другим.

person Alex Chen-WX    schedule 01.02.2016

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

import os
real_path = os.path.realpath('.')
print real_path

Результат переменной real_path текущего пути веб-задания равен D:\local\Temp\jobs\continuous\second\<a generated name like vjvunhav.obn>\.

Примечание

Чтобы узнать путь к WebJobs - Console.Out and Console.Error.

Таким образом, вы можете попробовать напрямую использовать абсолютный путь /Home/site/wwwroot/App_Data/pylib/azure.zip в приведенном ниже коде.

import sys
sys.path.insert(0, '/Home/site/wwwroot/App_Data/pylib/azure.zip')

С уважением.

person Peter Pan    schedule 01.02.2016

Когда выполняется веб-задание Azure, содержимое каталога копируется во временный подкаталог папки «data» вашего веб-сайта (в корне /data).

Если вы поместите zip-файл в ту же папку, что и ваш скрипт Python, он тоже будет скопирован. Если нет, вам нужно использовать абсолютный путь "/site/wwwroot/mysite/App_data/pylib/"

Это должно работать!

person totor    schedule 28.03.2017