我写了一个通过Jython 2.7执行的Python脚本。我需要SQLite,所以我决定在 / usr / local / lib / jython / Lib 下的Jython(link)中使用sqlite3。
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模块,如果使用的是CPython标准sqlite3模块。
现在,当我在ghidra_batch.py中导入open_db()时,就会发生我的问题:
from db import open_db
结果如下:
ImportError: cannot import name open_db
感谢您的帮助。
答案 0 :(得分:1)
一般规则:使用 Python 时,如果不是您所期望的东西,则只需 print 。
触发该异常的from db import open_db
行“告诉”我:
这就是为什么我在我的注释中建议打印有关该信息的信息(很明显,在发生错误之前):
import db
print(db)
print(dir(db))
输出确认了这一点。因此,还有另一个 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 ),并更新 import 语句。
(作为其他通用规则),请勿提供可能与 Python 库中的模块相冲突的模块(通用)名称。