1

我编写了一个 python cgi 脚本,它接收书籍文件 + 来自 html 表单的一些文本。脚本可以毫无问题地保存文件(在临时目录中:/opt/bibliotecha/tmp_bookcase/),但是我正在尝试使用 calibredb 工具将其添加到 calibre 库,但我没有成功。

我将有问题的部分隔离到以下脚本中;

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cgi 
import cgitb; cgitb.enable()

print "Content-type: text/html"
print

import os, subprocess
tmp_upload_path = "/opt/bibliotecha/tmp_bookcase/"
tmp_path_book = tmp_upload_path + "Vila-Matas,Enrique-Dublinesque(NewDirections,2012).epubVila-Matas,Enrique-Dublinesque(NewDirections,2012).epub"

subprocess.call(["calibredb", "add", tmp_path_book]) 

如果我从终端调用脚本,它会做应该做的事情。

如果我从浏览器调用脚本,我会收到以下消息:

No write acces to /var/www/.config/calibre using a temporary dir instead

我相信这个错误可能与从浏览器调用脚本时它使用不同的用户和组这一事实有关。但口径怎么能不抱怨呢?

我发现一个似乎解决了同样问题的线程 https://bugs.launchpad.net/calibre/+bug/1299635 他们提到运行口径的环境必须在 php 中相同(在他们的情况下)和控制台。

但我并没有真正了解口径环境,从未听说过。

有什么提示吗??:D

一个

4

2 回答 2

0

首先查看谁拥有该目录以及您当前的用户将拥有该目录的哪些权限。

这可以通过使用来完成ls -l。一旦确定了这一点,您就可以使用chmod允许您的用户写入该目录。

如果由于某种原因您在运行实际写入命令时确实需要使用特定用户,请查看这篇文章的答案:

以与长时间运行的进程不同的用户身份运行子进程

于 2014-06-20T08:44:05.607 回答
0

我成功地使用了这种方法一段时间,但在某些时候它完全停止工作,因为 Calibre 已更改为不再允许多个程序写入其数据库(可能是为了防止损坏)。

您现在(2021 年)需要做的事情:

配置并启动服务器。转到“首选项-> 共享-> 通过网络共享”。您需要[启动]服务器,并且可能选择“自动运行服务器”。

您需要记下端口号,或者您可以动态扫描文件~/.config/calibre/server-config.txt。查找该行,# The port on which to listen for connections然后下一行应该是port NNNNNNNN 端口号。如果找不到这些行,则在 GUI 中选择了默认端口 (NNNN=8080)。

要添加一本书,您需要将其放入的图书馆的名称。要获取可用库的列表,请运行:

calibredb add --with-library=http://localhost:NNNN/#-

硬编码生成的库名称 (LLL),或者如果您只有一个库,您可以再次从上述命令的输出中动态提取名称。如果您有多个库,则需要决定新添加的内容应该放在哪里。

现在您有了端口号 ( NNNN) 和库名称 ( LLL),您可以执行以下操作:

calibredb add --with-library=http://localhost:NNNN/#LLL

您还可以使用该选项--automerge=ignore来防止再次添加已经在数据库中的书籍。替换ignoreoverwrite替换现有文件,替换new_record为创建额外条目。

以上假设 calibre 与 cgi 脚本在同一台机器上运行。如果不是,则需要配置身份验证

于 2021-08-10T05:27:35.817 回答