【问题标题】:How to run a CLI command from a Python script?如何从 Python 脚本运行 CLI 命令?
【发布时间】:2021-11-17 09:21:47
【问题描述】:

当我在 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()

但它不起作用,您会收到以下错误: 'C:\Program' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

我也尝试过使用子进程: 操作系统的导入

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])

但它也不能正常工作。 请告诉我为什么它不起作用以及如何正确地做到这一点?

问候

【问题讨论】:

标签: python cmd command-line-interface


【解决方案1】:

空格很重要。

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

这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

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

解决此问题的方法是使用另一个反斜杠(例如'C:\\ProgramData\\...')转义您的反斜杠,或者将其设置为带有前缀r"raw" stringr'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

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

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

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

当命令作为参数发送时同样适用:

>>> 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

结论

看来你的行应该是这样的:

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

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

【讨论】:

  • 感谢您的广泛解释。最后一个命令完全符合我的预期,即它在图像上运行 ocr 并将结果复制到剪贴板。为什么这段代码不起作用? (CLI) set image = scan.jpg cmd / c "" C: \ Program Files (x86) \ ABBYY FineReader 15 \ FineReaderOcr.exe ""% file% / send Clipboard 是否可以在这里替换变量'image' 'scan.jpg' 的名称?在这个例子中如何使用 os.system 和 subprocess?问候
  • 查看python中格式化字符串的教程:geeksforgeeks.org/string-formatting-in-python
  • 如果这回答了您的问题,请标记为已接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多