如何通过 Smalltalk 中的标准输入、标准输出、标准错误与子进程进行交互?
How to interact with a subprocess through its stdin, stdout, stderr in Smalltalk?
此 Python 代码显示了如何调用 Windows 10 中的某个进程并向其发送字符串命令,通过标准输入读取其字符串响应, 进程的标准输出管道:
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import *
>>> p = Popen("c:/python38/python.exe", stdin=PIPE, stdout=PIPE)
>>> p.stdin.write(b"print(1+9)\n")
11
>>> p.communicate()
(b'10\r\n', None)
>>>
如您所见,python.exe 进程返回 10 作为对 print(1+9)
的回答。现在我想在 Pharo(或 Squeak)中做同样的事情:在 Windows 10 OS - 我想类似的东西,即简短、简单、可理解、真正有效。
我安装了 OSProcess、ProcessWrapper(它们在 Pharo 中丢失了,奇怪的是我收到警告说它们没有被标记为 Pharo 8.0 并且没有被检查在 Pharo 8.0 中工作,但是没问题) ,并且我尝试了 ProcessWrapper、PipeableOSProcess(从 Web 复制粘贴不同的片段)等 - 成功率为零!结果是:
- 没有任何反应,python.exe 未启动
- VM 错误控制台已打开(Pharo 底部的白色控制台,由 F2 菜单控制)
- 不同的例外情况
- 等等
有人能告诉我如何启动一个进程并向它发送命令、读取答案,然后在某个循环中再次发送等等的简单工作示例吗 - 我计划在一个分离的线程中进行这样的通信并将它用作一些服务,因为 Pharo,Smalltalk 通常缺少大多数绑定,所以我将像过去“美好”的日子一样使用子进程通信...
我知道如何调用命令并获取其输出:
out := LibC resultOfCommand: 'dir ', aDir.
但我说的是另一种情况:与 运行 进程交互通信(例如,使用 SSH 或类似上面的示例 - python.exe)。
PS。也许甚至可以使用 LibC #pipe:mode
?
让我先说 PipeableOsProcess
可能在 Windows 上坏了。我试过了,它只是打开了一个命令行,没有别的(它不会冻结我的 Pharo 8)。整个OSProcess
在我眼里不能正常工作。
所以我在 LibC
上试了一下,这应该不适用于 Windows。
I’m a module defining access to standard LibC. I’m available under Linux and OSX, but not under Windows for obvious reasons :)
接下来要说的是 Python 的 Windows 支持可能比 Pharo 的好很多。
更像是使用文件的变通方法的解决方案是使用 LibC
和 #runCommand:
(我试图想出一个与上面所示类似的示例):
| count command result outputFile errorFile |
count := 9+1. "The counting"
command := 'echo ', count asString. "command run at the command line"
outputFile := 'output'. "a file into which the output is redirected"
errorFile := 'error'. "a file where the error output is redirected "
result := LibC runCommand: command, "run the command "
' >', outputFile, "redirect the output to output file"
' 2>', errorFile.
"reading back the value from output file"
outputFile asFileReference contents lines.
"reading back the value from the error file - which is empty in this case"
errorFile asFileReference contents lines.
此 Python 代码显示了如何调用 Windows 10 中的某个进程并向其发送字符串命令,通过标准输入读取其字符串响应, 进程的标准输出管道:
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from subprocess import *
>>> p = Popen("c:/python38/python.exe", stdin=PIPE, stdout=PIPE)
>>> p.stdin.write(b"print(1+9)\n")
11
>>> p.communicate()
(b'10\r\n', None)
>>>
如您所见,python.exe 进程返回 10 作为对 print(1+9)
的回答。现在我想在 Pharo(或 Squeak)中做同样的事情:在 Windows 10 OS - 我想类似的东西,即简短、简单、可理解、真正有效。
我安装了 OSProcess、ProcessWrapper(它们在 Pharo 中丢失了,奇怪的是我收到警告说它们没有被标记为 Pharo 8.0 并且没有被检查在 Pharo 8.0 中工作,但是没问题) ,并且我尝试了 ProcessWrapper、PipeableOSProcess(从 Web 复制粘贴不同的片段)等 - 成功率为零!结果是:
- 没有任何反应,python.exe 未启动
- VM 错误控制台已打开(Pharo 底部的白色控制台,由 F2 菜单控制)
- 不同的例外情况
- 等等
有人能告诉我如何启动一个进程并向它发送命令、读取答案,然后在某个循环中再次发送等等的简单工作示例吗 - 我计划在一个分离的线程中进行这样的通信并将它用作一些服务,因为 Pharo,Smalltalk 通常缺少大多数绑定,所以我将像过去“美好”的日子一样使用子进程通信...
我知道如何调用命令并获取其输出:
out := LibC resultOfCommand: 'dir ', aDir.
但我说的是另一种情况:与 运行 进程交互通信(例如,使用 SSH 或类似上面的示例 - python.exe)。
PS。也许甚至可以使用 LibC #pipe:mode
?
让我先说 PipeableOsProcess
可能在 Windows 上坏了。我试过了,它只是打开了一个命令行,没有别的(它不会冻结我的 Pharo 8)。整个OSProcess
在我眼里不能正常工作。
所以我在 LibC
上试了一下,这应该不适用于 Windows。
I’m a module defining access to standard LibC. I’m available under Linux and OSX, but not under Windows for obvious reasons :)
接下来要说的是 Python 的 Windows 支持可能比 Pharo 的好很多。
更像是使用文件的变通方法的解决方案是使用 LibC
和 #runCommand:
(我试图想出一个与上面所示类似的示例):
| count command result outputFile errorFile |
count := 9+1. "The counting"
command := 'echo ', count asString. "command run at the command line"
outputFile := 'output'. "a file into which the output is redirected"
errorFile := 'error'. "a file where the error output is redirected "
result := LibC runCommand: command, "run the command "
' >', outputFile, "redirect the output to output file"
' 2>', errorFile.
"reading back the value from output file"
outputFile asFileReference contents lines.
"reading back the value from the error file - which is empty in this case"
errorFile asFileReference contents lines.