Python中windows计划任务执行脚本时,无法导入同级目录模块怎么办?

文件结构是这样的
d:\py<br>test.py
api.py
函数定义在 api.py 中,
test.py 中直接 import api
然后在 windows 计划任务里添加定时执行 test.py 无法调用 api.py 的相关函数。
在 cmd 下 python -u “d:\py<a target=”_blank" href=“http://test.py” rel=“nofollow”>test.py ”执行都没有问题。不知道问题出在哪里了。
Python中windows计划任务执行脚本时,无法导入同级目录模块怎么办?


6 回复

把你的父级目录动态加入到 sys.path 中
建议 from api import xxxx


这个问题很常见,是因为Windows任务计划程序的工作目录(Current Directory)和你开发时不一样,导致Python的模块导入路径(sys.path)里没有你的脚本目录。

核心原因:任务计划程序默认的工作目录通常是 System32 或其它系统目录,不是你的脚本所在目录。Python导入同级模块时,依赖当前目录在 sys.path 中。

解决方案:在脚本开头,动态地将脚本所在的目录添加到Python的模块搜索路径中。这是最可靠的方法。

具体代码: 在你的主执行脚本(也就是被任务计划调用的那个.py文件)的最开头,添加以下代码:

import os
import sys

# 获取当前脚本文件的绝对路径
script_path = os.path.abspath(__file__)
# 获取脚本所在的目录
script_dir = os.path.dirname(script_path)

# 将该目录添加到sys.path的最前面,确保优先搜索
if script_dir not in sys.path:
    sys.path.insert(0, script_dir)

# 现在可以安全导入同级目录的模块了
# 例如:import your_module
# from your_package import something

解释

  1. __file__ 变量包含了当前脚本的文件名。通过 os.path.abspath()os.path.dirname() 我们能准确得到它所在的目录,无论这个脚本从哪里被调用。
  2. sys.path 是一个列表,Python解释器按顺序在这里面查找要导入的模块。
  3. sys.path.insert(0, script_dir) 将你的脚本目录插入到列表开头,让它成为第一个被搜索的位置。这样,Python就能找到和你主脚本在同一文件夹下的其他 .py 文件(模块)或子包了。

举个例子: 假设你的项目结构如下,并且 main_task.py 被任务计划调用:

D:/my_project/
├── main_task.py      (你的主脚本,添加了上面的路径修复代码)
├── utils.py          (一个同级工具模块)
└── config/
    └── settings.py   (一个子目录下的模块)

main_task.py 开头添加了上述代码后,你就可以直接:

import utils
from config import settings

任务计划执行时就不会再报 ModuleNotFoundError 了。

一句话总结:在脚本开头用 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) 把脚本所在目录加入模块搜索路径。

当前目录的问题?

调用文件的路径问题,sys.path.append 试下

我也估计是当前目录的问题



谢谢你们,还有所有人,问题解决了,就是把目录加到 sys.path 再 import 就可以了。

回到顶部