如何解决Python multiprocessing.Process:如何将导入的目标函数的标准输出重定向到文件?
我有一组 Python 脚本 (script
有没有办法将脚本的标准输出重定向到一个单独的文件?
以简化形式,设置如下所示:
=== script1.py ===
def run(**kwargs):
<do stuff>
print(<stuff>)
=== server.py ===
import multiprocessing
import script1
p = multiprocessing.Process(target=script1.run) # <--- This output should be written to file,e.g. script1.txt
p.start()
更新:(丑陋的)解决方法
正如 Log output of multiprocessing.Process 中所建议的那样,它有助于在目标函数中用所需的文件句柄替换 sys.stdout。 由于我的目标函数位于不允许更改的不同模块中,因此我在导入步骤中操作了代码文本。
=== script1.py ===
def run(**kwargs):
<do stuff>
print(<stuff>)
=== server.py ===
import multiprocessing
import importlib
def replace_stdout(code):
""" Function to add sys.stdout = open(<file>) in run()"""
replaced_code = []
code_lines = code.split('\n')
for i,line in enumerate(code_lines):
replaced_code.append(line)
if line.startswith("def run(") :
# Check indentation if tab or spaces
indent = "\t" if code_lines[i+1][0] == '\t' else " "*( len(line.strip())-len(line))
# Add line to code
replaced_code.append(f'{indent}import sys')
replaced_code.append(f'{indent}sys.stdout=open("script1.txt","a")')
return "\n".join(replaced_code)
# Read script code from file,manipulate target function code and create module object
code = replace_stdout( open("script1.py","r").read() )
spec = importlib.util.spec_from_loader('script1',loader=None)
module_script1 = importlib.util.module_from_spec(spec)
exec(code,module_script1 .__dict__)
p = multiprocessing.Process(target=module_script1 .run) # <--- This output should be written to file,e.g. script1.txt
p.start()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。