io流获取返回值 ruby_python中ruby函数的返回值

博客讲述了如何在Python中执行Ruby脚本,并同时获取函数返回值和stdout输出。作者遇到了问题,当Ruby脚本中的case1为真时,输出被截断。尝试了使用`subprocess.check_output`和`subprocess.Popen`,但未能同时获得完整输出和返回值。寻求一种解决方案,能够在不修改Ruby代码的情况下,正确捕获所有输出和返回值。
摘要由CSDN通过智能技术生成

我有一个由python脚本执行的ruby脚本。在python脚本中,我想访问ruby函数的返回值。在

想象一下,我会有一个ruby脚本测试.rb:class TestClass

def self.test_function(some_var)

if case1

puts "This may take some time"

# something is done here with some_var

puts "Finished"

else

# just do something short with some_var

end

return some_var

end

end

现在,我想把函数的返回值放入python脚本中,打印的输出应该是stdout。在

我尝试了以下方法(示例1):

^{pr2}$

但是,这给出了stdout的全部输出,answer只是退出代码。在

因此,我尝试了这个(示例2):from subprocess import check_output

answer = check_output(["ruby", "-r", "test.rb", "-e", "puts TestClass.test_function('some meaningful text')"])

这给了我函数在else情况下的返回值(参见测试.rb)几乎马上。但是,如果case1为真,answer包含整个输出,但是在运行时测试.rb什么都不会印出来。在

有什么方法可以得到ruby函数的返回值和打印到stdout的语句吗?理想情况下,该解决方案不需要安装其他模块。此外,我不能更改ruby代码。在

编辑:

也尝试过这样做,但是在运行ruby脚本时,这也没有给出stdout的输出(示例3):import subprocess

process = subprocess.Popen(["ruby", "-r", "test.rb", "-e", "puts TestClass.test_function('some meaningful text')"], stdout=subprocess.PIPE)

answer = process.communicate()

我还认为这与在ruby脚本中将输出刷新到stdout无关。示例1立即给出了输出。在

Python,可以使用多线程来实现并发执行任务。然而,由于全局解释器锁(GIL)的存在,Python的多线程并不能真正实现多核并行处理,但可以在IO密集型任务提高效率。 要获取函数返回值,可以使用以下几种方法: 1. 使用`threading.Thread`类创建线程,并通过`join()`方法等待线程执行完毕,然后通过线程对象的属性获取返回值。 ```python import threading def my_function(): # 执行一些任务 return result # 创建线程 my_thread = threading.Thread(target=my_function) # 启动线程 my_thread.start() # 等待线程执行完毕 my_thread.join() # 获取返回值 result = my_thread.result ``` 2. 使用`concurrent.futures`模块的`ThreadPoolExecutor`类来管理线程池,并通过`submit()`方法提交任务,然后使用`result()`方法获取返回值。 ```python from concurrent.futures import ThreadPoolExecutor def my_function(): # 执行一些任务 return result # 创建线程池 executor = ThreadPoolExecutor() # 提交任务并获取Future对象 future = executor.submit(my_function) # 获取返回值 result = future.result() ``` 3. 使用`queue.Queue`类来在主线程和子线程之间传递数据,将函数返回值放入队列,在主线程获取返回值。 ```python import threading import queue def my_function(queue): # 执行一些任务 result = ... # 将结果放入队列 queue.put(result) # 创建队列 result_queue = queue.Queue() # 创建线程 my_thread = threading.Thread(target=my_function, args=(result_queue,)) # 启动线程 my_thread.start() # 获取返回值 result = result_queue.get() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值