如何获取pyinfra创建的目录的绝对路径?
如何获取pyinfra创建的目录的绝对路径?
嗨,这个问题我之前也踩过坑!你碰到的RuntimeError其实是pyinfra的核心工作模式导致的——它是先把所有要执行的操作都收集起来,最后再批量在目标主机上运行,所以你在定义操作的阶段直接去拿result.stdout肯定会报错,因为这时候目录创建的操作还没真的跑起来,哪来的结果呢😅
下面给你两种场景的解决方案,你可以根据自己的情况选:
场景1:本地执行(或已知执行时的工作目录)
如果是在本地运行pyinfra,或者你明确知道目标主机执行pyinfra时的初始工作目录,那直接用Python自带的os模块就能拼接出绝对路径,简单又高效:
import os # 把相对路径转成绝对路径 abs_dir_path = os.path.abspath("new_dir") print(f"目录的绝对路径是: {abs_dir_path}")
场景2:远程主机执行,或需要确保拿到目标机器的真实路径
如果是在远程主机上创建目录,或者你必须拿到目标机器上的实际绝对路径,那得配合pyinfra的操作钩子来处理,等目录创建成功后再去获取路径:
方法1:用on_success钩子直接打印结果
from pyinfra.operations import files, server # 先创建目录 files.directory("new_dir") # 执行shell命令获取绝对路径,用realpath或者cd + pwd都可以 server.shell( "realpath new_dir", # 操作成功后触发钩子,拿到结果 on_success=lambda state, host, result: print(f"远程主机上的绝对路径是: {result.stdout.strip()}") )
方法2:把路径存在host.data里,供后续操作使用
如果后续的操作还要用到这个路径,可以把它存在host.data里,方便后续调用:
from pyinfra.operations import files, server from pyinfra import host # 创建目录 files.directory("new_dir") # 定义一个钩子函数,用来保存路径 def save_directory_path(state, host, result): # 把结果存到host.data里 host.data.new_dir_absolute = result.stdout.strip() print(f"已保存绝对路径: {host.data.new_dir_absolute}") # 执行获取路径的shell操作 server.shell( "cd new_dir && pwd", on_success=save_directory_path ) # 后续操作就可以直接用这个路径啦 server.shell(f"echo 我要操作的目录是: {host.data.new_dir_absolute}")
简单来说,核心就是必须等pyinfra实际执行完目录创建的操作后,再去获取路径,不能在定义操作的阶段就去拿还没生成的结果~
备注:内容来源于stack exchange,提问作者asmaier
相关产品推荐
相关产品推荐

