You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将scriptB依赖从node-1传递至Dask Worker节点node-2

解决Dask Worker节点依赖传递的几种实用方法

我来给你捋几个靠谱的办法,搞定从node-1把scriptB需要的folder1、file1、file2这些依赖传到node-2的Dask Worker上的问题:


方法1:直接用Dask的Client.upload_file()上传(最简单直接)

Dask自带的upload_file()方法可以直接把本地文件/目录上传到所有Worker节点的工作目录下,完美适配你的场景。你只需要修改scriptA.py,在创建Client之后添加上传依赖的代码即可:

修改后的scriptA.py:

import shlex, subprocess
from dask.distributed import Client

def my_task(params):
    print("params[1]", params[1]) ## prints python scriptB.py arg1 arg2
    child = subprocess.Popen(shlex.split(params[1]), shell=False)
    child.communicate()

if __name__ == '__main__':
    clienta = Client("192.168.1.3:8786")
    
    # 上传所有需要的依赖文件和目录
    clienta.upload_file('file1.py')       # 上传单个文件
    clienta.upload_file('file2.py')
    clienta.upload_file('folder1/')       # 上传整个目录,注意末尾的斜杠不能少
    clienta.upload_file('scriptB.py')     # 别忘了上传scriptB本身!node-2上本来没有这个文件
    
    params=["dummy_arguments", "python scriptB.py arg1 arg2"]
    future = clienta.submit(my_task, params)
    print(future.result())
    print("over.!")

为什么这个方法好用?

  • 操作简单,不需要额外打包,直接上传就能用
  • 上传的文件/目录会自动出现在Worker的工作目录下,scriptB里的import语句可以直接找到依赖
  • 适合依赖文件不多、目录结构不复杂的场景

方法2:打包成Python包上传(适合复杂依赖/复用场景)

如果你的依赖比较多,或者以后还要重复使用这些模块,把它们打包成标准的Python包会更规范。

步骤1:在node-1上打包依赖

首先创建一个setup.py文件(放在和file1、file2同目录下):

from setuptools import setup, find_packages

setup(
    name="my_script_deps",
    version="0.1.0",
    packages=find_packages(),  # 自动识别folder1这样的包目录
    py_modules=["file1", "file2"],  # 单独的py文件
)

然后执行打包命令生成wheel包:

python setup.py bdist_wheel

执行后会在dist目录下生成类似my_script_deps-0.1.0-py3-none-any.whl的文件。

步骤2:修改scriptA上传包并安装

修改scriptA.py,上传wheel包,并且在任务执行前让Worker安装这个包:

import shlex, subprocess
from dask.distributed import Client

def my_task(params):
    # 先在Worker节点安装依赖包
    subprocess.run(shlex.split("pip install my_script_deps-0.1.0-py3-none-any.whl"), check=True)
    print("params[1]", params[1])
    child = subprocess.Popen(shlex.split(params[1]), shell=False)
    child.communicate()

if __name__ == '__main__':
    clienta = Client("192.168.1.3:8786")
    
    # 上传打包好的依赖包和scriptB
    clienta.upload_file('dist/my_script_deps-0.1.0-py3-none-any.whl')
    clienta.upload_file('scriptB.py')
    
    params=["dummy_arguments", "python scriptB.py arg1 arg2"]
    future = clienta.submit(my_task, params)
    print(future.result())
    print("over.!")

这个方法的优势:

  • 依赖管理更规范,适合复杂项目
  • 可以重复使用这个包,不需要每次都上传一堆零散文件
  • 支持版本控制,方便后续更新依赖

注意事项

  • 不管用哪种方法,一定要上传scriptB.py本身,node-2的Worker上默认没有这个文件
  • 如果你的依赖里有隐藏文件或者特殊路径,上传时要确保路径正确
  • 要是Worker节点有多个,upload_file()会自动同步到所有Worker,不用挨个操作

内容的提问来源于stack exchange,提问作者TheCodeCache

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:51:48