【问题标题】:Writing text in the Windows console using Python after a specific program have taken control在特定程序获得控制权后,使用 Python 在 Windows 控制台中编写文本
【发布时间】:2016-11-03 11:44:05
【问题描述】:

我有一个软件 - FUNCOR2.exe - 用于计算给定数据文件的自相关函数,即 test.txt

首先,我从 Windows 命令行执行FUNCOR2.exe,然后程序控制并询问我输入数据文件。

我想在 Python 中自动化这个,所以我可以使用工作:

os.system("FUNCOR2")

但是我无法在程序中输入输入文件名。

到目前为止我已经尝试过:

PressKey(0x54) # T
PressKey(0x45) # E
PressKey(0x53) # S
PressKey(0x54) # T
PressKey(110) # .
PressKey(0x54) # T
PressKey(0x58) # X
PressKey(0x54) # T

我从Generate keyboard events 拿的,但它不起作用,还有:

win32api.keybd_event(0x54, 0) 
win32api.keybd_event(0x45, 0)
win32api.keybd_event(0x53, 0)
win32api.keybd_event(0x54, 0)
win32api.keybd_event(110, 0)
win32api.keybd_event(0x54, 0)
win32api.keybd_event(0x58, 0)
win32api.keybd_event(0x54, 0)

它也不起作用。

这个程序不接受参数,所以我不能使用:

FUNCOR2.exe test.txt

我在这里找到了类似的东西:Writing in the cmd after executing an app.exe from java,但根本没有。

有什么想法吗?

【问题讨论】:

  • 它真的是 MS-DOS 程序,还是 Windows 命令行程序? MS-DOS 不支持多任务处理,当另一个进程正在运行时你不能做任何事情。在后一种情况下,您可以使用 Python 的subprocess
  • 我相信 99% 它是一个 MS-DOS 程序,不能从其他地方启动,只能从控制台启动。我只需要一种模拟键盘的方法。
  • 如果这是一个执行标准统计计算的程序(并且自相关是相当标准的),它的功能可能包含在 padas/scipy/numpy 的某个地方。直接从 Python 数据分析库中弄清楚如何做可能会更好地利用时间。
  • VBScript 程序可以接受命令行参数。如果你真的想走这条路,写一个 VBScript 程序来做你想做的事情(使用SendKeys)然后从 Python 调用它可能会更容易。您将遇到许多相同的问题,但使用的是更接近 Windows 的语言。至少,你会找到更多关于使用SendKeys 运行 MS-DOS 程序的资源,然后你会找到关于使用 Python 的资源。
  • MS-DOS 程序是控制台应用程序,但并非所有控制台应用程序都是 MD-DOS 程序!考虑阅读这篇文章:The Windows command prompt is NOT a DOS prompt!

标签: python cmd keyevent


【解决方案1】:

我发现(除了你的问题)唯一提到 FUNCOR2 的是论文 "A library of computer programs for assisting teaching and research in cyclostratigraphic analysis" 。由于这是来自《计算机与地球科学》杂志,而且您在 GIS 领域,我认为这是正确的。

有几种可能性(除了发送击键,这充其量是冒险的):

1) 论文清楚地给出了正在使用的公式(快速浏览实际的 Fortran 代码downloadable from the Journal's website 确认没有其他操作)表明这很容易在 Python 中实现,无论是直接 Python 还是使用 @987654323 @(具有计算自相关的功能)。

2) 修改 Fortran 源代码并使用开源 Fortran 编译器重新编译(我不是 Fortran 专家,但这似乎是 Fortran 77)。在您看到的代码的开头:

READ (5,100,ERR=1) CFIL1
OPEN (1,FILE=CFIL1)

第一行是代码如何从用户那里获取文件名。将该行替换为读取命令行参数的行,瞧——你有一个FUNCOR2 的版本,它从命令行获取其输入文件,因此很容易从 Python 调用。在 Fortran 中找到从命令行参数获取文件名的示例应该很容易。我的猜测是只需 1 或 2 行代码替换该行就足够了。我没有足够的兴趣尝试,并且怀疑它是否值得。这是因为源代码中的另一行是:

DIMENSION X(1024),V(1024),COR(200),NPA(200)

奇怪的是,如果您的文件有超过 1024 个观察值,程序就会失败。也许在 90 年代后期写这篇论文时这样的事情是有道理的,但几乎可以肯定有等效的 pandas 代码能够处理数百万次观察。有时应该允许旧代码消亡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2011-11-25
    • 1970-01-01
    • 2018-12-16
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多