[英]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.
实际上你在这个里面有很多问题。
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)
func_name
(假设它是test.py
)? 在test.py
目录中,做$ python -c 'from test import func_name; func_name()'
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.