【问题标题】:Cannot import Python function in Jython无法在 Jython 中导入 Python 函数
【发布时间】:2019-04-08 17:12:40
【问题描述】:

我编写了一个通过 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

感谢您的帮助。

【问题讨论】:

  • 如果在 ghidra_batch.py​​ 之前 from db import open_db 中添加import dbprint(db)print(dir(db)) 行会怎样?跨度>
  • 只尝试import db 看看会发生什么
  • @CristiFati,这里是结果:<java package db 0x2> ['__name__', 'buffers', 'util'] @MobrineHayde,NameError: global name 'open_db' is not defined
  • 所以,如您所见,它不是您认为的 db (db.py)。我不知道该模块是什么,但您可以通过将文件 (db.py) 重命名为 sqlite_db_wrapper.py 并修改您的 import 语句。
  • 你是我的救星,救了我一天,非常感谢!

标签: python sqlite jython importerror


【解决方案1】:

作为一般规则:使用 Python 时,如果某些事情不是您所期望的,只需 print 它。

触发该异常的 from db import open_db 行“告诉”我:

  • db 模块(包)被发现
  • 这不是您所期望的(您的 db.py

这就是为什么我在评论中建议打印有关它的信息(显然,在发生错误之前):

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.javasqlite-jdbc 是一个jython-sqlite3 依赖项)。

合理的方法是将你的模块名称修改为其他名称(例如:sqlite_db_wrapper.py),同时更新 import 语句。

作为一个(n 其他)一般规则,不要为您的模块(通用)名称提供可能与 Python 库中的模块冲突的名称

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2016-12-04
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多