我想在 Windows 上使用 Python 2.6 来启动几个单独的命令窗口,每个命令窗口都运行自己的 Python 脚本。目的是:这些是客户端,我试图用来自多个准独立客户端的请求加载服务器。
我不需要在运行期间或运行后与客户端通信,但我确实需要向每个客户端发送不同的命令行参数,并且我希望每个客户端的输出在其自己的“控制台”中滚动。
在 DOS 命令行中,“开始”命令执行我想要的操作。我可以:
start perf_test.py 2
或者
start cmd /c perf_test.py 3
或者
start cmd /c python perf_test.py 4
(如果您为 *.py 文件正确设置了“文件关联”,这些对您有用。如果您需要帮助,还有其他线程。或者,使用 python exe 和/或脚本的完整路径。)
我的挑战是:如何从 Python 中获得相同的效果?
使用subprocess
库,我尝试过这样的变体:
from subprocess import *
p = Popen(["perf_test.py", "4"], shell=True, stdin=PIPE)
但即使使用shell=True
,输出也会混合在我已经运行的窗口中。添加stdout=PIPE
会停止,但我必须阅读p.stdout
或使用p.communicate()
. 将“cmd”添加到 Popen 大致相同:
p = Popen(["cmd", "/c", "perf_test.py", "4"], shell=True, stdin=PIPE)
以上都没有达到我想要的效果,即:“为这个脚本弹出一个新的、不同的窗口,并在它自己的控制台中观察它的输出滚动”(因为我真的想运行这些客户端中的 N 个在平行下)。
我求助的另一件事也几乎奏效了。
import os
os.startfile("perf_test.py")
这会立即返回,并弹出一个实际的 dosbox。耶!成功!也就是说,直到我尝试添加一个论点。这失败了:
os.startfile("perf_test.py 5")
出现错误“系统找不到指定的文件”......因为它正在将“[SPACE] 5”添加到文件名中。(参数的目的是每个“perf_test”都需要有一个分配的 ID,以便它们作为不同的实例访问服务器。)
我考虑过的其他方法,由于各种原因真的不喜欢:
- 在自己的线程中运行每个“perf_test”。(但我真的很想在自己的控制台中看到每个输出。)
- 用 Tk 制作我自己的伪控制台。(图我会在那里遇到不同的线程问题。)
- 使用“start perf_test.py 1”、“start perf_test.py 2”等行动态写入 .BAT 文件,然后使用
Popen
或启动该 .BAT 文件startfile
。
我希望最后一个会起作用......我想这是我最后的手段,如果我不能直接使用 Python 脚本来完成它。
感谢您的任何意见/见解!