如何从另一个python程序启动,停止和获取输出

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (425)

我希望能够启动,停止并获取另一个python程序的控制台输出。我不想在当前程序中运行它,我希望它们作为两个单独的实例运行。

这两个文件都在同一目录中。

我已经看到了如何获得另一个python程序的控制台输出的指南,以及如何启动和停止它,但我还没有找到两者的指南。

我还应该注意,我想要输出的文件是.pyw文件。

谢谢。

编辑:不是重复,它不是那么简单......

EDIT2:

这是我的尝试

main.py

import subprocess

p = subprocess.Popen(['python', 'sub.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# continue with your code then terminate the child
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print(line)
p.wait()

sub.py

import time

for i in range(100):
    print(i)
    time.sleep(1)

它有点工作,但它打印出来就像

b'0 \ r \ n'b'1 \ r \ n'b'2 \ r \ n'b'3 \ r \ n'b'4 \ r \ n'

EDIT3:

import subprocess

p = subprocess.Popen(['python', 'sub.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
with p.stdout:
    for line in iter(p.stdout.readline, b''):
        print(line.decode("utf-8").replace("\r\n", ""))
p.wait()

这是最好的方法吗?

但是,我仍然有问题。我想完全单独运行程序,所以我应该能够在main.py程序中同时运行其他代码,但这不起作用。

import subprocess
import time


def get_output():
    p = subprocess.Popen(['python', 'sub.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    with p.stdout:
        for line in iter(p.stdout.readline, b''):
            print(line.decode("utf-8").replace("\r\n", ""))
    p.wait()


def print_stuff():
    for i in range(100):
        print("." + str(i))
        time.sleep(1)


if __name__ == "__main__":
    get_output()
    print_stuff()
import time


def main():
    for i in range(100):
        print(i)
        time.sleep(1)


if __name__ == "__main__":
    main()

编辑4: 这是我尝试同时运行它们

import subprocess
import asyncio


async def get_output():
    p = subprocess.Popen(['python', 'sub.py', 'watch', 'ls'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    with p.stdout:
        for line in iter(p.stdout.readline, b''):
            print(line.decode("utf-8").replace("\r\n", ""))
    p.wait()


async def print_stuff():
    for i in range(100):
        print("." + str(i))
        await asyncio.sleep(1)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.gather(
        print_stuff(),
        get_output()
    ))
    loop.close()
import asyncio


async def main():
    for i in range(100):
        print(i)
        await asyncio.sleep(1)

if __name__ == "__main__":
    asyncio.run(main())

预期的产出是

.0 0 .1 1 .2 2 ...

但输出是

.0 0 1 2 3 4 5 ...

编辑5: 我认为问题是subprocess.Popen持有程序,所以我认为我需要使用asyncio.create_subprocess_execm但我无法弄清楚如何让它工作。

提问于
用户回答回答于

对不起初步评论。 我知道一种方法,但我不确定它是否适用于所有操作系统。它涉及subprocess模块:

import subprocess
import os
#another python file with possible inputs
command = "python3 test2.py"
#get current file dir as thats where test2.py is located
fileDir = os.path.dirname(os.path.realpath(__file__))
#gets outputs printed on the terminal
process = subprocess.check_output(command.split(), cwd=fileDir)
print(process)

此方法还确保在继续主代码之前完成第二个脚本。 编辑:输出是字节形式,在这里解码像process.decode('utf-8') 更多

用户回答回答于

当我问一个类似的问题时,我就是这样做的。打印时我还需要输出,而不是等待缓冲区填充。

儿童过程

from time import sleep

# Dummy child process for popen demonstration
# Print "sleeping" at 1-sec intervals, then a "QUIT" message.

for _ in range(5):
    print(_, "sleeping")
    sleep(1)

print("Child process finishes")

父母过程

import subprocess
import time

# Turn off output buffering in Python;
#   we need each output as soon as it's printed.
environ["PYTHONUNBUFFERED"] = "1"

# Locate the child's source file -- YOU can use a local path.
branch_root = environ["PYTHONPATH"]
cmd = ["/usr/bin/python3", branch_root + "popen_child.py"]

# Start the child process, opening a pipe from its stdout
# Include stderr under stdout.
test_proc = subprocess.Popen(
    cmd,
    universal_newlines=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
)

print(time.time(), "START")

# Catch and print the output as it's generated.
for out_data in iter(test_proc.stdout.readline, ""):
    print(time.time(), out_data, end="")

print("TEST completed")

打开和关闭“收听”是父进程中关注的问题。

扫码关注云+社区

领取腾讯云代金券