手记07之解释器文件(Interpreter Files)

先看例程8.10(exec2.c)

#include "apue.h"
#include<sys/wait.h>

int main(void)
{
    pid_t    pid;
    if((pid = fork() ) < 0)
    {
        err_sys("fork error");
    }
    else if(pid == 0)
    {/* child */
        if(execl("/home/yao/work/myAPUE/ch08/testinterp", "testinterp", "myarg1", "MY ARG2", (char *)0 ) < 0)
        {
            err_sys("execl error");
        }
    }
    if(waitpid(pid, NULL, 0) < 0)    /* parent */
    {

        err_sys("waitpid error");
    }

    exit(0);
}

编译例程

$ gcc –o exec2 exec2.c

testinterp文件中输入如下内容

$ cat > testinterp
#! /home/yao/work/myAPUE/ch08/echoarg foo
EOF(Ctrl+D)
$chmod u+x testinterp

echoarg.c的文件内容如下:

#include "apue.h"

int
main(int argc, char *argv[])
{
    int        i;

    for (i = 0; i < argc; i++)        /* echo all command-line args */
        printf("argv[%d]: %s/n", i, argv[i]);
    exit(0);
}


编译例程echoarg.c

$ gcc –o echoarg echoarg.c

最后运行./exec2

$ ./exec2
argv[0]: /home/yao/work/myAPUE/ch08/echoarg
argv[1]: foo
argv[2]: /home/yao/work/myAPUE/ch08/testinterp
argv[3]: myarg1
argv[4]: MY ARG2

这个到目前为止都比较好理解。比较有意思的是当你运行testinterp文件时候出现的第三个参数”./testinterp”

$ ./testinterp
agv[0]: /home/yao/work/myAPUE/ch08/echoarg
argv[1]: foo
argv[2]: ./testinterp

因为在Shell处理脚本文件时,会调用forkexecwait函数(手记06之shell如何执行脚本),和程序exec2.c一样用d调用了execl函数,首先,execl函数对#!行分析后得出此脚本的解释器为”/home/yao/work/myAPUE/ch08/echoarg”,然后就形成了把命令行处理成了:”/home/yao/work/myAPUE/ch08/echoarg foo ./testinterp”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
from tkinter import * from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import PDFPageAggregator, TextConverter from pdfminer.layout import LAParams, LTTextBoxHorizontal from pdfminer.pdfpage import PDFPage class PDFViewer: def init(self, master): self.master = master master.title("PDF Viewer") # 创建文本框和滚动条 self.text = Text(master) self.scrollbar = Scrollbar(master, command=self.text.yview) self.text.configure(yscrollcommand=self.scrollbar.set) self.text.pack(side=LEFT, fill=BOTH, expand=True) self.scrollbar.pack(side=RIGHT, fill=Y) # 打开 PDF 文件 fp = open('x1/2023凯程333教育综合应试解析-外国教育史(OCR).pdf', 'rb') # 创建 PDF 解析器 parser = PDFParser(fp) # 创建 PDF 文档对象 document = PDFDocument(parser) # 获取页面布局参数 laparams = LAParams() # 创建 PDF 资源管理器 rsrcmgr = PDFResourceManager() # 创建聚合器对象 device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 创建 PDF 解释器 interpreter = PDFPageInterpreter(rsrcmgr, device) # 处理每一页 PDF 页面 for page in PDFPage.create_pages(document): interpreter.process_page(page) # 获取页面布局 layout = device.get_result() # 提取每一页的文本内容 for x in layout: if isinstance(x, LTTextBoxHorizontal): text = x.get_text().strip() self.text.insert(END, text + '\n') # 关闭 PDF 文件 fp.close() root = Tk() pdf_viewer = PDFViewer(root) root.mainloop()上述文本框添加保存到本地功能的完整代码
05-27

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值