#python #sqlite #jython #importerror
#python #sqlite #jython #ошибка импорта
Вопрос:
Я написал скрипт на Python, который выполняется через Jython 2.7. Мне нужен SQLite, поэтому я решил использовать sqlite3 для Jython (ссылка), который находится в /usr/local/lib/jython/Lib .
ghidra_batch.py
import sys
sys.path.append("/usr/local/lib/jython/Lib")
sys.path.append("/path/to/my/project/directory")
import sqlite3
Я создал другой файл, в котором я определяю некоторые функции для своей базы данных:
db.py
import platform
import sys
if platform.python_implementation == 'Jython':
sys.path.append("/usr/local/lib/jython/Lib")
sys.path.append("/path/to/my/project/directory")
import sqlite3
def open_db():
[some code]
def create_schema():
[some code]
Примечание: я проверяю реализацию Python, потому что этот скрипт запускается также через CPython. Я добавляю путь только при запуске через Jython, чтобы он нашел свой модуль sqlite3, в случае, если используется стандартный модуль sqlite3 CPython.
Теперь моя проблема возникает, когда я импортирую open_db() в ghidra_batch.py:
from db import open_db
Результат следующий:
ImportError: cannot import name open_db
Спасибо за вашу помощь.
Комментарии:
1.Что произойдет, если вы добавите
import db
,print(db)
,print(dir(db))
строки в ghidra_batch.py раньшеfrom db import open_db
?2. попробуйте только
import db
и посмотрите, что произойдет3. @CristiFati, вот результаты:
<java package db 0x2> ['__name__', 'buffers', 'util']
@MobrineHayde,NameError: global name 'open_db' is not defined
4. Итак, как вы видите, это не та база данных, о которой вы думаете ( db.py ). Я не знаю, что это за модуль, но вы можете обойти проблему, переименовав свой файл ( db.py ) к sqlite_db_wrapper.py , а также изменение вашего оператора импорта .
5. Ты мой спаситель, спас мне день, большое спасибо!
Ответ №1:
Как общее правило: при работе с Python, когда что-то не соответствует вашим ожиданиям, просто распечатайте это.
Ваша from db import open_db
строка, которая вызывала это исключение, «сказала» мне, что:
- Найден модуль (пакет) базы данных
- Это не тот, который вы ожидаете (ваш db.py )
Вот почему я предложил в своем комментарии распечатать информацию об этом (очевидно, до появления ошибки):
import db
print(db)
print(dir(db))
Вывод подтвердил это. Итак, есть еще один модуль БД, который импортируется перед вашим. Я попытался воспроизвести вашу среду (установил Jython, но мне не удалось установить jython-sqlite3).
После небольшого исследования я думаю, что это [BitBucket]: Taro L. Saito/sqlite-jdbc/Source — sqlite-jdbc/src/main/java/org/sqlite/DB.java (sqlite-jdbc — это зависимость jython-sqlite3).
Разумный способ — изменить имя вашего модуля на что-то другое (например: sqlite_db_wrapper.py ), а также обновите инструкцию (инструкции) импорта.
В качестве (n другого) общего правила не указывайте своим модулям (общие) имена, которые могут конфликтовать с модулями из библиотеки Python.