Не удается импортировать функцию Python в Jython

#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.