Я уже пробовал читать и писать с помощью различных доступных механизмов - похоже, разницы нет.
ВАЖНО: проблемы не будет, если я никогда не сохраняю файл .gpkg! Если приведенный ниже код используется с .geojson, все в порядке.
Код: Выделить всё
"""The script causes the kernel to die in certain environments,
and I cannot figure out why it happens.
"""
import geopandas as gpd
import pandas as pd
import time
# gpd_engine="pyogrio"
# gpd_engine="fiona"
gpd_engine=None
print("Write a DataFrame")
pd.DataFrame({"A": [1, 2]}).to_excel("test.xlsx",
engine='openpyxl',
# engine='xlsxwriter',
)
print("OK")
print("Read a DataFrame")
pd.read_excel("test.xlsx")
print("OK")
df = pd.DataFrame({'col1': ['name1', 'name2'],
'wkt': ['POINT (1 2)', 'POINT (2 1)']})
gs = gpd.GeoSeries.from_wkt(df['wkt'])
gdf = gpd.GeoDataFrame(df, geometry=gs, crs="EPSG:4326")
print("Write a GeoDataFrame")
geofile = "geopandas-test.gpkg" # This causes the kernel error later
# geofile = "geopandas-test.geojson" # This is always fine
gdf.to_file(geofile, engine=gpd_engine)
print("OK")
print("Read a GeoDataFrame")
gpd.read_file(geofile, engine=gpd_engine)
print("OK")
print("Write a DataFrame")
time.sleep(1) # Without sleep, the previous print() gets lost sometimes
# Kernel death happens here sometimes
pd.DataFrame({"A": [1, 2]}).to_excel("test.xlsx",
# engine='openpyxl',
# engine='xlsxwriter',
)
print("OK")
print("Read a DataFrame")
time.sleep(1) # Without sleep, the previous print() gets lost sometimes
# Kernel death happens here sometimes
pd.read_excel("test.xlsx")
print("OK")
print("Test finished successfully")
Написание GeoPackage загружает драйвер GPKG/SQLite GDAL (собственные библиотеки C).
Эти собственные библиотеки изменяют состояние всего процесса (блокировки, обработчики или поведение потока/распределителя), что позже конфликтует с путем кода pandas/openpyxl использует для записи XLSX, и это столкновение приводит к сбою интерпретатора.
GeoJSON избегает конкретного пути кода GPKG/SQLite, который вызывает конфликт, так что все в порядке.
У меня есть минимальная среда, которая работает нормально, и «полная» среда, которая мне нужна для других целей, где возникает проблема. С Ubuntu всегда все в порядке, проблема только в Windows. Различные версии Python, похоже, не имеют значения.
Я создал репозиторий GitHub для воспроизведения проблемы и сужения пакетов, вызывающих ее.
https://github.com/jnettels/kernel-death-test
Я попросил ChatGPT написать одно задание рабочего процесса для каждого дополнительного пакета, который мне нужен в моей производственной среде. Это тоже не помогло. Все они в порядке, за исключением «полного» списка пакетов, установленного из файла среды:
https://github.com/jnettels/kernel-deat ... 0166928359
Я думаю, теперь все сводится к каналам, используемым для установки (кстати, в данном случае я использую conda.)
Вот два случая:
Код: Выделить всё
-c defaults -c conda-forgeКод: Выделить всё
-c conda-forgeУстановка из файла среды ведет себя иначе, чем установка conda all-my-packages-as-a-list. Но мне также интересно, меняется ли это в зависимости от того, как используется вспомогательное действие conda.
Я нарушаю ограничения на количество символов, показывая выходные данные
Код: Выделить всё
conda infoЭто может быть полезным рабочим процессом для изоляции проблемы между практически идентичными настройками:
https://github.com/jnettels/kernel-deat ... 7900276206
Он также показывает информацию о пакете и предоставляет ее в качестве артефакта загрузки.
Есть ли какой-нибудь совет, как поступить?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -geopandas
Мобильная версия