Python跨脚本如何仅传递image_uri变量不执行main其他逻辑
问题背景
现有一段Python脚本,核心功能为读取本地图片二进制流上传至Pinata服务,拼接IPFS哈希生成image_uri资源地址,调用元数据生成函数后返回image_uri,原代码如下:
def main(): with Path(filepath).open("rb") as fp: image_binary = fp.read() response = requests.post( PINATA_BASE_URL + endpoint, files={"file": (filename, image_binary)}, headers=headers, ) ipfs_hash = response.json()["IpfsHash"] print(response.json()) image_uri = "{}{}".format(first_part_image_uri, ipfs_hash) print(image_uri) # 调用create_image_uri_meta_file函数 simple_collectible = SimpleCollectible[len(SimpleCollectible) - 1] token_id = simple_collectible.tokenCounter() create_image_uri_meta_file(response, token_id) return image_uri
当前问题
目前尝试通过导入main函数调用的方式,在另一个脚本中获取image_uri变量,实现代码如下:
from scripts.upload_to_pinata import main image_uri = main() image_uri_from_upload = image_uri
该方案存在明显缺陷:调用main()时会执行函数内全部指令、加载无关变量,实际需求仅为获取image_uri的值,不希望触发main函数内元数据生成等其他无关逻辑。
需要接入该变量的目标脚本片段如下:
from scripts.upload_to_pinata import main image_uri = main() image_uri_from_upload = image_uri image_uri_from_upload = "" def main():
可行实现方案
首先明确一个基础逻辑:Python中不存在不执行代码直接获取函数内部局部变量的方法,image_uri是代码执行到拼接步骤才会生成的值,要拿到这个值,最少也要执行完「读取图片-上传Pinata-拼接哈希生成URI」这几个必要步骤,所有方案的核心都是把必要步骤和无关附加步骤做隔离,执行到拿到目标值就返回,跳过后续不需要的逻辑。
- 方案1:拆分函数逻辑,抽离核心能力
不要把上传、URI生成、元数据生成所有逻辑全塞在同一个main函数里,把生成image_uri的核心逻辑抽成独立函数,无关逻辑单独放在其他分支,改造示例:
跨脚本调用时直接导入def upload_get_image_uri(): # 仅保留生成image_uri的必要逻辑 with Path(filepath).open("rb") as fp: image_binary = fp.read() response = requests.post( PINATA_BASE_URL + endpoint, files={"file": (filename, image_binary)}, headers=headers, ) ipfs_hash = response.json()["IpfsHash"] image_uri = f"{first_part_image_uri}{ipfs_hash}" return image_uri, response def main(): image_uri, response = upload_get_image_uri() print(response.json()) print(image_uri) # 仅在需要时执行元数据生成逻辑 simple_collectible = SimpleCollectible[len(SimpleCollectible) - 1] token_id = simple_collectible.tokenCounter() create_image_uri_meta_file(response, token_id) return image_uriupload_get_image_uri()即可,不会触发元数据生成等无关逻辑。 - 方案2:给main函数加控制参数
如果不想拆分原有函数结构,可以给main函数增加布尔类型入参,用来控制是否执行后续附加逻辑,改造示例:
跨脚本调用时写def main(only_return_uri=False): with Path(filepath).open("rb") as fp: image_binary = fp.read() response = requests.post( PINATA_BASE_URL + endpoint, files={"file": (filename, image_binary)}, headers=headers, ) ipfs_hash = response.json()["IpfsHash"] image_uri = f"{first_part_image_uri}{ipfs_hash}" # 仅需要URI时直接返回,不执行后续逻辑 if only_return_uri: return image_uri print(response.json()) print(image_uri) simple_collectible = SimpleCollectible[len(SimpleCollectible) - 1] token_id = simple_collectible.tokenCounter() create_image_uri_meta_file(response, token_id) return image_uriimage_uri = main(only_return_uri=True)即可,拿到目标值后会直接返回,不会执行后续无关代码。 - 方案3:缓存固定值避免重复执行
如果image_uri是固定值、不需要每次运行都重新上传图片生成,可以在第一次执行完上传逻辑后,把image_uri写入本地配置文件(比如json、.env文件),其他脚本直接读取本地配置中的值即可,完全不需要重复执行上传相关逻辑。
内容的提问来源于stack exchange,提问作者maxver
相关产品推荐
相关产品推荐

