如何使用 Python 控制从 .cmd 文件打开的命令窗口

发布于 2024-11-06 19:13:59 字数 659 浏览 0 评论 0原文

有一个名为startup.cmd的文件,它设置一些环境变量,运行一些准备命令,然后执行以下操作:

start "startup" cmd /k

这将打开一个名为startup的命令shell。我尝试自动化的手动过程是在该 shell 中输入以下命令:getstartup.xml。我认为在 Python 中执行此操作的正确方法是这样的:

import subprocess

p = subprocess.Popen('startup.cmd', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

getcommand = 'get startup.xml'
servercommand = 'startserver'
p.stdin.write(getcommand)
p.stdin.write(startserver)
(stdoutdata, stderrdata) = p.communicate()
print stdoutdata
print stderrdata

但是这些命令似乎没有在 shell 中执行。我缺少什么?此外,无论 shell 设置为 True 还是 False,命令 shell 都会出现。

There's a file named startup.cmd that sets some environment variables, runs some preparation commands, then does:

start "startup" cmd /k

Which opens a command shell named startup. The manual process I'm trying to automate is to then enter the following command into this shell: get startup.xml. I thought the correct way to do this in Python would be something like this:

import subprocess

p = subprocess.Popen('startup.cmd', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

getcommand = 'get startup.xml'
servercommand = 'startserver'
p.stdin.write(getcommand)
p.stdin.write(startserver)
(stdoutdata, stderrdata) = p.communicate()
print stdoutdata
print stderrdata

But those commands don't seem to be executing in the shell. What am I missing? Also, the command shell appears regardless of whether shell is set to True or False.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

好听的两个字的网名 2024-11-13 19:13:59

我在子进程的文档中发现了这个警告,

警告使用communicate()而不是.stdin.write、.stdout.read或.stderr.read来避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致的死锁。

所以我的建议是使用通信来发送命令。

import subprocess

p = subprocess.Popen('startup.cmd', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

command = 'get startup.xml\n'
command += 'startserver\n'
(stdoutdata, stderrdata) = p.communicate(command)
print stdoutdata
print stderrdata

I found this warning in subprocess's document,

Warning Use communicate() rather than .stdin.write, .stdout.read or .stderr.read to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.

So my suggestion is to use communicate to send your command.

import subprocess

p = subprocess.Popen('startup.cmd', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

command = 'get startup.xml\n'
command += 'startserver\n'
(stdoutdata, stderrdata) = p.communicate(command)
print stdoutdata
print stderrdata
被翻牌 2024-11-13 19:13:59

这是一个新进程,因此无法直接与 Popen 通信。

This is a new process, so one cannot communicate directly with Popen.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文