Установка gdal+python+IDE (с отладчиком)

Ответить
Boris
Гуру
Сообщения: 4225
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Установка gdal+python+IDE (с отладчиком)

Сообщение Boris » 22 ноя 2024, 01:53

Подскажите, как установить на Windows 10x64 GDAL(OGR) с python'ом и средой программирования, в которой есть отладчик, который сможет увидеть формат структур, что создает/возвращает GDAL в python.
Хотел решить простейшую задачу - перебрать векторные слои и проверить их атрибуты и корректность данных. Решил, что python должен подойти для такой простой задачи.
Поставил свежий GDAL с OSGeo4W (GDAL 3.9.3, released 2024/10/07). После некоторых ухищрений заставил PyCharm использовать python и библиотеки из каталога с GDAL. Возможно, что не до конца все определил все переменные окружения, но тест на импорт модуля gdal.ogr и печать версии GDAL прошел. Перебор векторных драйверов тоже. Коды этих программ нашел в интернете.
Захотел чуть большего - получил из вызванной функции некоторую структуру, в описании которой потерялся. Как и в описании функции - не нашел разумного описания возвращаемого объекта в интернете. print выводит только ссылку на класс
"<osgeo.ogr.Driver; proxy of <Swig Object of type 'OGRDriverShadow *' at 0x000001F124A31320> >"
Решил, что смогу увидеть хоть какие-то поля в отладчике, но он отказался работать: сперва написал что неправильно скомпилированный python. Я нашел что надо добавить параметр "-Xfrozen_modules=off" в командную строку вызова python, это сообщение ушло. Но теперь не находится какой-то модуль для импорта
ModuleNotFoundError: No module named 'imp'
Не хочется в разбираться в хитросплетениях настройки отладчика, т.к. выполнение без отладки - работает.
Хотел взять чистый python и установить в него GDAL. Запустил pip install gdal. Пакет найден, загружен, но что-то не компилируется, что-то не выгружается - каких-то H-файлов нет.
Хочется поставить комплект что на 100% заработает.

trir
Гуру
Сообщения: 5328
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1018
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Установка gdal+python+IDE (с отладчиком)

Сообщение trir » 22 ноя 2024, 02:20

Welcome to Python World!

По этому я пишу на C#

Boris
Гуру
Сообщения: 4225
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Установка gdal+python+IDE (с отладчиком)

Сообщение Boris » 22 ноя 2024, 16:53

trir писал(а):
22 ноя 2024, 02:20
Welcome to Python World!

По этому я пишу на C#
Это не особенная проблема для меня, а там больше документации? Какую IDE для этого используете?

gamm
Гуру
Сообщения: 4127
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1096
Ваше звание: программист
Откуда: Казань

Re: Установка gdal+python+IDE (с отладчиком)

Сообщение gamm » 22 ноя 2024, 18:35

Борис, не очень понятно что Вы делаете. То ли скомпилировали Python+gdal, и из отладчика С++ хотите что-то увидеть, то ли хотите увидеть из отладчика Питона внутренности gdal, написанные на С++.

Никакие структуры gdal в Питон не передает (незачем), в Питоне есть обертки для функций gdal, и все, вот они и вызываются. Все структуры описаны в головниках gdal, если хотите чего-нибудь изучить, смотрите головники и исходники, или пишите программу на С++, и бродите в отладчике.

Тут c# вряд ли поможет, по той же причине, что и с Питоном - gdal написан на С++, вот его отладчиком и нужно "бродить". Я когда-то давно просто поместил исходники gdаl в папку проекта VisualStudio на С++, добавил в проект, компилировал все вместе и бродил отладчиком.

Boris
Гуру
Сообщения: 4225
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Установка gdal+python+IDE (с отладчиком)

Сообщение Boris » 22 ноя 2024, 19:54

gamm писал(а):
22 ноя 2024, 18:35
Никакие структуры gdal в Питон не передает (незачем), в Питоне есть обертки для функций gdal, и все, вот они и вызываются. Все структуры описаны в головниках gdal, если хотите чего-нибудь изучить, смотрите головники и исходники, или пишите программу на С++, и бродите в отладчике.
Я хотел просто распечатать названия слоев в GPKG, имена и типы полей. В перспективе пройтись по выбранным полям, чтобы проанализировать их состав и размер, в следующей перспективе - поправить.
OGRINFO выдает с одной стороны лишние, с другой стороны недостаточные данные - не считает правильно тип и размер полей. Сидеть вычленять из текстового файла поля, по нетривиальным параметрам, я посчитал глупым, если есть, как я полагал, доступ к данным через язык программирования. В С и С++ лезть не хотелось, я взял официально декларированный как "вам хватит" python. Опыт программирования в нем, при разумной документации, у меня есть.
Но, тут я потерялся сразу - запустил тестовый пример:

Код: Выделить всё

# Is Ogr Installed ?
try:
    from osgeo import ogr

    print('Import of ogr from osgeo worked.  Hurray!\n')
except:
    print('Import of ogr from osgeo failed\n\n')
# Get List of Ogr Drivers Alphabetically (A- Z)
# It’s always driven me a little nuts that the command line ogr2ogr –formats
# returns a ‘random’ list of drivers. This code returns the list of OGR
# drivers alphabetically from A - Z. .
# import ogr
cnt = ogr.GetDriverCount()
formatsList = []  # Empty List

for i in range(cnt):
    driver = ogr.GetDriver(i)
    driverName = driver.GetName()

    if not driverName in formatsList:
        formatsList.append(driverName)
        t = (driver.name, driver.GetDescription(), [b]driver.getLongName())
        # driver.GetShortName(), \
        #           driver.GetLongName(), )[/b]
        print(t)

formatsList.sort()  # Sorting the messy list of ogr drivers

for i in formatsList:
    print(i)
Ради интереса, я захотел увидеть дополнительную информацию о драйверах OGR, для начала driver.getLongName() и driver.GetShortName()
Описание класса driver ссылаются один на другой и отсылают к классу C++ (наверное). В документации python API описание функции дано строкой, без расшифровки полей, и возвращаемого значения. Предложено посмотреть исходную документации на функцию С++. Но, я что-то и там не нашел никаких разъяснений какими свойствами обладает возвращенный объект. Во многих языках, если были у меня сомнения в документации, я загружал код в отладчик и смотрел, что за объект мне вернулся. Если функци он мне мог и не показать, то поля (свойтва) должен отобразить. В python'е в pyCharm'е я так делал. Из того, что вместо driver.GetName() можно использовать driver.name я предположил, что все таки возвращается некий объект класса. Возможно, что в части GDAL я ошибся.
В любом случае, программирование без элементарного отладчика - занятие очень странное.
PS
Я хочу использовать python+GDAL+[ IDE с отладчиком | отдельный отладчик ]. GDAL я не компилировал:
1. Взял тот, что входит в OSGeo4W и его python 3.12. Создал как смог, быстро, venv в PyCharm по мотивам переменных окружения, что устанавливает OSGeo4W для свое оболочки командной строки. GDAL подключился, отработал. НО отладчик работать с этой версией(?), компиляцией(?) python отказался. Много букв выдал при запуске - смысл "не нахожу какого-то модуля, который считаю, что должен быть". Ок - не хочу разбираться.

Попробую иной вариант:
2. Создаю пустую venv в PyCharm. Проверяю - отладчик на ней работает. Пытаюсь поставить GDAL через встроенный механизм установки - пишет, что хочет что-то скомпилировать и для этого надо поставить "Windows Kits" с сайта микрософта. Ок. Поставил. Запустил заново - похоже, действительно, зачем-то запустилась компиляция GDAL из исходных файлов c/h. На каком-то из них не хватает заголовочного h-файла. Запустил pip из оболочки с теми же переменными окружения - результат такой же. Не хочу вникать и разбираться что и зачем компилирует.
Хочу чтобы работало: python+GDAL+[ IDE с отладчиком | отдельный отладчик ]
Собственно в этом в весь вопрос : "Какой пакет или среду поставить чтобы реализовать эту хотелку?" Неужели все GDAL python API программируют без среды и отладчика? Может где-то и документация по функциям есть написанная для использования API, а не для изучения исходных кодов библиотек на С? Или книжка какая?

gamm
Гуру
Сообщения: 4127
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1096
Ваше звание: программист
Откуда: Казань

Re: Установка gdal+python+IDE (с отладчиком)

Сообщение gamm » 22 ноя 2024, 20:59

насколько я знаю, нормальной документации нет, только то, что генерирует автоматом doxygen из исходного кода. И разные тьюториалы разной степени качества. Привычки писать комментарии в стиле питона у разработчиков gdal тоже нет, насколько я помню. Коме того, там скорее структуры. Посмотрел исходник, для драйвера возвращается указатель void*, который потом приводится к нужному виду. В самом классе тоже ничего умного не видно

Код: Выделить всё

/**
 * \brief Format specific driver.
 *
 * An instance of this class is created for each supported format, and
 * manages information about the format.
 * 
 * This roughly corresponds to a file format, though some          
 * drivers may be gateways to many formats through a secondary     
 * multi-library.                                                  
 */

class CPL_DLL GDALDriver : public GDALMajorObject
{
  public:
                        GDALDriver();
                        ~GDALDriver();

/* -------------------------------------------------------------------- */
/*      Public C++ methods.                                             */
/* -------------------------------------------------------------------- */
    GDALDataset         *Create( const char * pszName,
                                 int nXSize, int nYSize, int nBands,
                                 GDALDataType eType, char ** papszOptions ) CPL_WARN_UNUSED_RESULT;

    CPLErr              Delete( const char * pszName );
    CPLErr              Rename( const char * pszNewName,
                                const char * pszOldName );
    CPLErr              CopyFiles( const char * pszNewName,
                                   const char * pszOldName );

    GDALDataset         *CreateCopy( const char *, GDALDataset *, 
                                     int, char **,
                                     GDALProgressFunc pfnProgress, 
                                     void * pProgressData ) CPL_WARN_UNUSED_RESULT;
    
/* -------------------------------------------------------------------- */
/*      The following are semiprivate, not intended to be accessed      */
/*      by anyone but the formats instantiating and populating the      */
/*      drivers.                                                        */
/* -------------------------------------------------------------------- */
    GDALDataset         *(*pfnOpen)( GDALOpenInfo * );

    GDALDataset         *(*pfnCreate)( const char * pszName,
                                       int nXSize, int nYSize, int nBands,
                                       GDALDataType eType,
                                       char ** papszOptions );

    CPLErr              (*pfnDelete)( const char * pszName );

    GDALDataset         *(*pfnCreateCopy)( const char *, GDALDataset *, 
                                           int, char **,
                                           GDALProgressFunc pfnProgress, 
                                           void * pProgressData );

    void                *pDriverData;

    void                (*pfnUnloadDriver)(GDALDriver *);

    int                 (*pfnIdentify)( GDALOpenInfo * );

    CPLErr              (*pfnRename)( const char * pszNewName,
                                      const char * pszOldName );
    CPLErr              (*pfnCopyFiles)( const char * pszNewName,
                                         const char * pszOldName );

/* -------------------------------------------------------------------- */
/*      Helper methods.                                                 */
/* -------------------------------------------------------------------- */
    GDALDataset         *DefaultCreateCopy( const char *, GDALDataset *, 
                                            int, char **,
                                            GDALProgressFunc pfnProgress, 
                                            void * pProgressData ) CPL_WARN_UNUSED_RESULT;
    static CPLErr        DefaultCopyMasks( GDALDataset *poSrcDS, 
                                           GDALDataset *poDstDS, 
                                           int bStrict );
    static CPLErr       QuietDelete( const char * pszName );

    CPLErr              DefaultRename( const char * pszNewName,
                                       const char * pszOldName );
    CPLErr              DefaultCopyFiles( const char * pszNewName,
                                          const char * pszOldName );
};

Boris
Гуру
Сообщения: 4225
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Установка gdal+python+IDE (с отладчиком)

Сообщение Boris » 26 ноя 2024, 19:24

Спасибо за ответы. Пойду дальше искать и экспериментировать.

Ответить

Вернуться в «GDAL/OGR»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость