繁体   English   中英

从命令行或子进程 popen 运行 python function

[英]Run python function from command line or subprocess popen

我想运行一个名为test.counttest()的测试 function,最多计数 10。

def counttest():
    x = 0
    for x in range(0,3):
        x = x+1
        print("Number: "+ str(x))
        time.sleep(1)

我想从命令行或从子进程 popen只调用 function 不写function,直接调用。 我在谷歌上的所有东西都让我回到了如何从命令行编写 function 这不是我需要的。

我需要专门从子进程 popen 运行 function 以便我可以在 forloop 中获取标准输出,然后可以将其发送到 flask 套接字。 (这是必需的)

要点 - 如何从命令行或子进程调用(不写) function?

不是这个:

python -c 'import whatever then add code'

但是这样的事情:

python "test.counttest()"

或像这样:

subprocess.Popen(['python', ".\test.counttest()"],stdout=subprocess.PIPE, bufsize=1,universal_newlines=True)

编辑:这是给@Andrew Holmgren 的。 考虑以下脚本:

def echo(ws):
    data = ws.receive()
    with subprocess.Popen(['powershell', ".\pingtest.ps1"],stdout=subprocess.PIPE, bufsize=1,universal_newlines=True) as process:
            for line in process.stdout:
                line = line.rstrip()
                print(line)
                try:
                    ws.send(line+ "\n")
                except:
                    pass

这非常适合我需要的东西:获取脚本的标准输出并将其发送到ws.send() function,这是一个 websocket。

但是,对于 function,我需要同样的概念。 我知道如何轻松获取标准输出的唯一方法是使用subprocess.popen但如果有另一种方法让我知道。 这就是为什么我试图通过子进程模块运行 function 的 hackjob 方式。

The question of Run python function from command line or subprocess popen relates in the fact that if I can get a function to run from subprocess, then I know how to get the stdout for a websocket.

实际上你在这个里面有很多问题。

  1. 如何将 function 的 output 逐行发送到另一个(和/或 websocket)? 只需避免写入标准输出并直接通信即可。 yield (或其他生成器创建方法)正是为此而设计的。
import time

def counttest():
    for i in range(10):
        yield f'Item {i}'
        time.sleep(1)

def echo(ws):
    # data = ws.receive()
    for row in counttest():
        ws.send(row)
  1. 如何从命令行调用文件中定义的 function func_name (假设它是test.py )? test.py目录中,做
$ python -c 'from test import func_name; func_name()'
  1. 如何从sys.stdout读取? 最简单的方法是将其替换为io.StringIO并稍后恢复。
from contextlib import redirect_stdout
import io

def echo(ws):
    f = io.StringIO()
    with redirect_stdout(f):
        counttest()
    output = f.getvalue()
    ws.send(output)

它只会在call_function()之后返回,因此您无法监控实时打印的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM