В настоящее время я работаю над скриптом Python, запускаемым через Jython 2.7, и я использую модуль sqlite3 для Jython ( link ), синтаксис которого идентичен модулю CPython sqlite3.
Здесьэто код:
def file_exists(self, cur, file_hash):
cur.execute("SELECT 1 FROM samples WHERE file_hash = ?", (file_hash,))
ret = cur.fetchone()
if ret is None:
return False
return True
cur.execute("SELECT 1 FROM samples WHERE file_hash = ?", (file_hash,))
TypeError: execute() takes exactly 2 arguments (3 given)
Я посмотрел в Интернете, и синтаксис, кажется, правильный, поэтому я не понимаю, что является причиной этой проблемы.
РЕДАКТИРОВАТЬ:
import os
import sys
import time
import json
import logging
import sqlite3
from hashlib import sha1
ANALYSIS_FAILED = 0
ANALYSIS_SUCCESS = 1
ANALYSIS_ALREADY = 2
class ProgramAnalyzer:
def __init__(self):
self.filename = None
self.cyclomatic_complexities = None
self.primes = None
self.signature = None
self.file_hash = None
self.total_functions = 0
self.analysis_date = None
self.architecture = None
def file_exists(self, cur, file_hash):
cur.execute("SELECT 1 FROM samples WHERE file_hash = ?", (file_hash,))
ret = cur.fetchone()
if ret is None:
return False
return True
def analyze(self):
t = time.time()
executable_path = getCurrentProgram().getExecutablePath()
content = open(executable_path, 'r').read()
self.file_hash = sha1(content).hexdigest()
# Checking whether such file is already in the database
conn = cur = None
try:
conn = sqlite3.connect('db.sqlite')
cur = conn.cursor()
except sqlite3.Error as e:
logging.error("Database error: " + str(e))
return ANALYSIS_FAILED
if self.file_exists(cur, self.file_hash):
return ANALYSIS_ALREADY
print("File not in database")
[initializing remaining object fields]
return ANALYSIS_SUCCESS
def main():
analyzer = ProgramAnalyzer()
ret = analyzer.analyze()
if ret == ANALYSIS_FAILED:
sys.exit(1)
if __name__ == "__main__":
main()
Такие функции, как getCurrentProgram () и getExecutablePath () - это некоторые Java API, которые я использую.