从start_worker.py调用train_worker.py遇文件找不到错误,求解决方案
解决在
start_worker.py中调用train_worker.py的问题 首先明确一点:Python 3已经移除了execfile()函数,所以这个方法完全不可行,得换其他更合适的方式。
至于你遇到的No such file or directory错误,大概率是运行start_worker.py时的当前工作目录不是脚本所在的目录,导致系统找不到同目录下的train_worker.py。下面给你几个靠谱的解决方案:
方案1:用subprocess模块(推荐,最符合外部脚本调用场景)
subprocess是Python官方推荐的执行外部命令的模块,能完美解决路径问题。你可以先获取start_worker.py的绝对目录,再拼接train_worker.py的路径,这样不管在哪运行都不会出错。
示例代码:
import subprocess import os # 获取当前脚本所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 安全拼接train_worker.py的绝对路径 train_worker_path = os.path.join(script_dir, "train_worker.py") # 调用脚本并传递参数3 subprocess.run(["python3", train_worker_path, "3"], check=True)
解释:
os.path.abspath(__file__)拿到当前脚本的完整绝对路径os.path.dirname()提取路径中的目录部分os.path.join()自动适配不同系统的路径分隔符(Windows用\,Linux用/),避免手动拼接出错check=True会在子脚本运行出错时主动抛出异常,方便你调试排查问题
方案2:把train_worker.py当作模块导入(适合脚本可模块化的场景)
如果train_worker.py的代码逻辑适合被复用,你可以重构它的结构,然后直接导入调用,不用启动新的Python进程。
步骤1:修改train_worker.py,把核心逻辑封装成函数:
# train_worker.py def main(params): # 这里放原来的脚本逻辑,比如处理传入的参数(比如你之前传的3) print(f"收到参数:{params[0]}") # 保留原有的命令行调用逻辑 if __name__ == "__main__": import sys main(sys.argv[1:])
步骤2:在start_worker.py中导入并调用:
# start_worker.py import os import sys # 把脚本所在目录加入Python搜索路径(同目录下其实可以省略,但加上更稳妥) sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import train_worker # 传递参数3 train_worker.main(["3"])
这个方案的好处是进程内调用,效率更高,还能直接在两个脚本之间共享变量(如果有需要的话)。
方案3:修复原命令的路径问题(不推荐,但适合快速临时解决)
如果你坚持想用原来的命令调用方式,那得把train_worker.py的绝对路径写进命令里:
import os import subprocess script_dir = os.path.dirname(os.path.abspath(__file__)) # 用绝对路径调用脚本 subprocess.run(f"python3 {os.path.join(script_dir, 'train_worker.py')} 3", shell=True, check=True)
不过这个方案用了shell=True,如果参数来自不可信来源,会有安全风险,所以优先推荐前两个方案。
总结:execfile()在Python3里已经被移除,上面的三个方案里,方案1是最通用的,方案2适合脚本可模块化的场景,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者user7689454
相关产品推荐
相关产品推荐

