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

Haj*_*jpa 1 python cmd command-line-interface

当我在 CMD (Windows 10) 中编写此内容时,就可以了。识别出的文本在剪贴板中:“C:\Program Files (x86)\ABBYY FineReader 15\FineReaderOcr.exe”“C:\Python39\Scripts\abbyy\Skan.JPG”/发送剪贴板

我想用 Python 脚本做同样的事情,以便能够解析剪贴板的内容。我正在尝试使用以下方法来做到这一点:

import sys
import os
def mycmd():
  os.system('cmd /c "C:\Program Files (x86)"\ABBYY FineReader 15\FineReaderOcr.exe" "skan.JPG" " /send Clipboard"')
mycmd()
Run Code Online (Sandbox Code Playgroud)

但它不起作用,并且出现以下错误:“C:\Program”未被识别为内部或外部命令、可操作程序或批处理文件。

我还尝试使用 subprocess: import of os

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])
Run Code Online (Sandbox Code Playgroud)

但它也没有发挥应有的作用。请告诉我为什么它不起作用以及如何正确执行?

问候

rke*_*ols 5

空白很重要。

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

我做了一些类似的例子来说明什么有效,什么无效:

不使用空格的文件路径

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

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

该命令不起作用:

>>> 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
Run Code Online (Sandbox Code Playgroud)

因为它包含\u(in ...\usr\...)。当您用作\u字符串的一部分时,Python 期望它是 Unicode 转义序列的一部分(例如,print("\u2019")将为您提供一个特殊的撇号)

解决这个问题的方法是用另一个反斜杠(例如'C:\\ProgramData\\...')转义反斜杠,或者使其成为带有前缀的“原始”字符串rr'C:\ProgramData\...'

这让我们来到这里:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

解决方案是在包含空格的整个文件路径周围加上引号:

>>> os.system(r'"C:\Program Files (x86)\LilyPond\usr\bin\python.exe" --version')
Python 3.7.4
0
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

结论

所以看起来你的行应该是这样的:

os.system(r'cmd /c ""C:\Program Files (x86)\ABBYY FineReader 15\FineReaderOcr.exe" skan.JPG" /send Clipboard')
Run Code Online (Sandbox Code Playgroud)

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