首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Python脚本运行CLI命令?

如何从Python脚本运行CLI命令?
EN

Stack Overflow用户
提问于 2021-11-17 09:21:48
回答 1查看 110关注 0票数 0

当我用CMD (Windows10)写这篇文章时,一切正常。识别出的文本在剪贴板中:"C:\ Program Files (x86) \abbyyscript15\ FineReaderOcr.exe“"C:\ Python39 \ Scripts \ ABBYY \ Skan.JPG”/发送剪贴板

我想用Python脚本做同样的事情,以便能够解析剪贴板的内容。我正在尝试使用以下命令来完成此操作:

代码语言:javascript
运行
复制
import sys
import os
def mycmd():
  os.system('cmd /c "C:\Program Files (x86)"\ABBYY FineReader 15\FineReaderOcr.exe" "skan.JPG" " /send Clipboard"')
mycmd()

但是它不起作用,你会得到以下错误:'C:\ Program‘没有被识别为内部或外部命令,可操作的程序或批处理文件。

我还尝试使用子进程:导入os

代码语言:javascript
运行
复制
import subprocess
program = 'C: \ Program Files (x86) \ ABBYY FineReader 15 \ FineReaderOcr.exe'
file = 'C: \ Python39 \ Scripts \ abbyy \ Skan.JPG'
lang = "/ lang Polish"
send = "/ send Clipboard"
subprocess.run (["C: \ Program Files (x86) \ ABBYY FineReader 15 \ FineReaderOcr.exe", "scan.JPG", "/ send Clipboard"])
subprocess.call ([program, file, send])

但它也不能像它应该的那样工作。请告诉我为什么它不能工作,以及如何正确地使用它?

问候

EN

回答 1

Stack Overflow用户

发布于 2021-11-17 10:19:48

空格很重要。

Program Files中的空格使得第一个文件路径被解释为两个单独的参数,而它不知道如何将第一个参数C:\Program解释为命令。

我举了几个类似的例子来说明什么是有效的,什么是无效的:

不使用空格的文件路径

代码语言:javascript
运行
复制
>>> import os
>>> os.system('C:\ProgramData\Miniconda3\python.exe --version')
Python 3.9.1
0
>>> os.system('cmd /c "C:\ProgramData\Miniconda3\python.exe --version"')
Python 3.9.1
0
>>> os.system(r'cmd /c "C:\ProgramData\Miniconda3\python.exe --version"')
Python 3.9.1
0

这3个版本都是成功的,因为C:\ProgramData\Miniconda3\python.exe文件路径中没有空格。

包含空格和\u的文件路径

此命令不起作用:

代码语言:javascript
运行
复制
>>> os.system('C:\Program Files (x86)\LilyPond\usr\bin\python.exe --version')
  File "<stdin>", line 1
    os.system('C:\Program Files (x86)\LilyPond\usr\bin\python.exe --version')
                                                                            ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 31-32: truncated \uXXXX escape

因为它包含\u (在...\usr\...中)。当你使用\u作为字符串的一部分时,python希望它是Unicode转义序列的一部分(例如,print("\u2019")会给你一个特殊的撇号)

解决这个问题的方法是使用另一个反斜杠对反斜杠进行转义(例如'C:\\ProgramData\\...'),或者使用前缀为rr'C:\ProgramData\...'"raw" string对其进行转义

这就把我们带到了这里:

代码语言:javascript
运行
复制
>>> os.system(r'C:\Program Files (x86)\LilyPond\usr\bin\python.exe --version')
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
1

这就是我最初描述的问题;空格用于分隔命令/参数,并且不能明确地包含在文件路径中。

解决方案是用引号将包含空格的整个文件路径括起来:

代码语言:javascript
运行
复制
>>> os.system(r'"C:\Program Files (x86)\LilyPond\usr\bin\python.exe" --version')
Python 3.7.4
0

当命令作为参数发送时,同样的情况也适用:

代码语言:javascript
运行
复制
>>> os.system(r'cmd /c "C:\Program Files (x86)\LilyPond\usr\bin\python.exe --version"')
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
1
>>> os.system(r'cmd /c ""C:\Program Files (x86)\LilyPond\usr\bin\python.exe" --version"')
Python 3.7.4
0

结论

因此,您的代码行看起来应该是这样的:

代码语言:javascript
运行
复制
os.system(r'cmd /c ""C:\Program Files (x86)\ABBYY FineReader 15\FineReaderOcr.exe" skan.JPG" /send Clipboard')

(虽然我不知道/send Clipboard部分是用来做什么的,因此可能需要对此进行调整。然而,这应该解决了问题中询问的错误)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70001747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档