我编写了一个python cgi脚本,它接收书籍文件+来自html表单的一些文本。 脚本保存文件没有问题(在临时目录:/ opt / bibliotecha / tmp_bookcase /),但我尝试使用calibredb工具将其添加到口径库,但我没有成功。
我将有问题的部分分离到以下脚本中;
#!/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
一
答案 0 :(得分:0)
首先看看谁拥有该目录以及当前用户对该目录的权限。
可以使用ls -l
完成此操作。确定后,您可以使用chmod
允许您的用户写入此目录。
如果由于某种原因你在运行实际的写命令时确实需要使用特定的用户,那么看一下这篇文章的答案:
Run child processes as different user from a long running process
答案 1 :(得分:0)
我成功地使用了这种方法一段时间,但在某些时候它完全停止工作,因为 Calibre 已更改为不再允许多个程序写入其数据库(可能是为了防止损坏)。
您现在(2021 年)需要做什么:
配置并启动服务器。转到“首选项 -> 共享 -> 通过网络共享”。您需要[启动]服务器,并且可能选择“自动运行服务器”。
您需要记下端口号,或者您可以动态扫描文件~/.config/calibre/server-config.txt
。查找行 # The port on which to listen for connections
然后下一行应该是 port NNNN
与 NNNN 端口号。如果找不到这些行,则在 GUI 中选择了默认端口 (NNNN=8080)。
要添加一本书,您需要将其放入图书馆的名称。要获取可用库的列表,请运行:
calibredb add --with-library=http://localhost:NNNN/#-
硬编码生成的库名称 (LLL),或者如果您只有一个库,您可以再次从上述命令的输出中动态提取名称。如果您有多个库,则需要决定新添加的库应该放在何处。
现在您有了端口号 (NNNN
) 和库名称 (LLL
),您可以执行以下操作:
calibredb add --with-library=http://localhost:NNNN/#LLL
您还可以使用选项 --automerge=ignore
来防止再次添加数据库中已有的图书。将 ignore
替换为 overwrite
以替换现有文件,将 new_record
替换为创建额外条目。
以上假设 calibre 与 cgi 脚本在同一台机器上运行。如果没有,则需要配置身份验证