python - 无法通过 sh/crontab 启动 python 程序

标签 python linux shell cron

我尝试从脚本或作为 cronjob 启动一个名为 ocrmypdf 的 python 程序。

它在终端上完美运行,

pi@piscan:~ $ ocrmypdf 
usage: ocrmypdf [-h] [--verbose [VERBOSE]] [--version] [-L FILE] [-j N] [-n]
            [--flowchart FILE] [-l LANGUAGE] [--title TITLE]
            [--author AUTHOR] [--subject SUBJECT] [--keywords KEYWORDS]
            [-d] [-c] [-i] [--oversample DPI] [-f] [-s]
            [--skip-big MPixels] [--tesseract-config TESSERACT_CONFIG]
            [--pdf-renderer {auto,tesseract,hocr}]
            [--tesseract-timeout TESSERACT_TIMEOUT] [-k] [-g]
            input_file output_file
ocrmypdf: error: the following arguments are required: input_file, output_file

但是从另一个 shell 中它会因为我不明白的原因而崩溃。

pi@piscan:~ $ sh ocrmypdf
sh: 0: Can't open ocrmypdf
pi@piscan:~ $ which ocrmypdf 
/usr/local/bin/ocrmypdf
pi@piscan:~ $ sh $(which ocrmypdf)
import: unable to open X server `' @ error/import.c/ImportImageCommand/364.
import: unable to open X server `' @ error/import.c/ImportImageCommand/364.
from: can't read /var/mail/ocrmypdf.main
/usr/local/bin/ocrmypdf: 10: /usr/local/bin/ocrmypdf: Syntax error: "(" unexpected (expecting "then")

这是执行的代码:

pi@piscan:~ $ cat $(which ocrmypdf)
#!/usr/bin/python3

# -*- coding: utf-8 -*-
import re
import sys

from ocrmypdf.main import run_pipeline

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(run_pipeline())

最佳答案

当您输入 sh ocrmypdf 时,您会要求 sh shell(可能是 /bin/sh,通常是 /bin/bash/bin/dash 的符号链接(symbolic link))解释 ocrmypdf 文件,该文件是一个 Python 脚本,而不是 shell 脚本。

因此,要么运行python ocrmypdfpython $(which ocrmypdf),要么使ocrmypdf脚本可执行。然后(至少在 Linux 上)execve(2)start the python interpreter ,因为 shebang .

当然,ocrmypdf 脚本应该位于您的 PATH

并且 crontab 作业未在您的桌面环境中运行。所以他们无权访问您的X11服务器Xorg (或者 Wayland ,如果您正在使用它)。您可以为此显式设置 DISPLAY 变量,但我不建议这样做。

关于python - 无法通过 sh/crontab 启动 python 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34565080/

相关文章:

python - 将整个函数作为字符串获取/并将字符串转换为函数?

python - 在buildroot中添加一个pypi python包

linux - 如何将前 N 个字节从文本文件移动到另一个文本文件

shell - 我在电脑上安装了fish shell,现在打不开VS code终端

linux - 文件的文件权限

python - Matplotlib 无法在 Django 上渲染多个等高线图

python - 使用 Python 创建 3D 数组

linux - 使用 awk 打印从第 n 到最后的所有列

yocto 的 Linux 功能

linux - 用于识别文件中缺失值的 Shell 脚本