Python os.path.join() 使用 cron 作业时未正确加入
Python os.path.join() not joining properly when using cron job
我在 /home/pi/update_rrd_data.py 有一个 python 脚本,它应该将日志存储在文件夹 /home/pi/logs_rrd.
中
我是这样实现的:
current_folder = os.path.dirname(os.path.abspath(inspect.stack()[0][1]))
log_folder = os.path.join(current_folder, 'logs_rrd')
if not os.path.exists(log_folder): os.makedirs(log_folder)
file_name = __file__[:-3] + '_' + datetime.strftime(datetime.now(), '%Y%m%d%H%M') + '.log'
log_file = os.path.join(log_folder, file_name)
logging.basicConfig(filename=log_file, level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(filename)s->%(funcName)s:%(message)s', datefmt='%m/%d/%Y_%I:%M:%S_%p')
logging.info('\nCurrent Folder: {}\nLog Folder: {}\nLog File: {}'.format(current_folder, log_folder, log_file))
当我手动 运行 脚本时,它工作正常,这是我在 /home/pi/logs_rrd/update_rrd_data_201709271426.log:
的日志文件中得到的
当前文件夹:/home/pi
日志文件夹:/home/pi/logs_rrd
日志文件:/home/pi/logs_rrd/update_rrd_data_201709271426.log
但是,当我 运行 它作为 cron 作业时,日志文件是在与脚本相同的文件夹而不是 logs_rrd 文件夹中创建的。这是我在 /home/pi/update_rrd_data_201709271445.log:
的日志文件中得到的
当前文件夹:/home/pi
日志文件夹:/home/pi/logs_rrd
日志文件:/home/pi/update_rrd_data_201709271445.log
我不明白为什么日志文件夹的值是正确的,但是日志文件删除了日志文件夹的 logs_rrd 部分。
这就是我 运行 cron 的方式:
*/5 * * * * /usr/bin/python /home/pi/update_rrd_data.py
所有文件夹和文件都归 root 所有,因此不应该有任何写权限问题。
在不起作用的情况下,__file__
可能是绝对路径,所以
log_file = os.path.join(log_folder, file_name)
没有效果,(它返回 file_name
)并保留原始脚本目录。
而不是__file__[:-3]
,只要做:
os.path.basename(os.path.splitext(__file__)[0])
在所有情况下删除脚本文件路径的扩展名(在某些情况下可能不是 .py
顺便说一句) 和 ,所以下一个 os.path.join
命令正常工作。
使用 pathlib
和 Path
对象的替代解决方案(需要 Python 3):
pathlib.Path(__file__).with_suffix('').name
删除目录和文件扩展名的结果相同。
我在 /home/pi/update_rrd_data.py 有一个 python 脚本,它应该将日志存储在文件夹 /home/pi/logs_rrd.
中我是这样实现的:
current_folder = os.path.dirname(os.path.abspath(inspect.stack()[0][1]))
log_folder = os.path.join(current_folder, 'logs_rrd')
if not os.path.exists(log_folder): os.makedirs(log_folder)
file_name = __file__[:-3] + '_' + datetime.strftime(datetime.now(), '%Y%m%d%H%M') + '.log'
log_file = os.path.join(log_folder, file_name)
logging.basicConfig(filename=log_file, level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(filename)s->%(funcName)s:%(message)s', datefmt='%m/%d/%Y_%I:%M:%S_%p')
logging.info('\nCurrent Folder: {}\nLog Folder: {}\nLog File: {}'.format(current_folder, log_folder, log_file))
当我手动 运行 脚本时,它工作正常,这是我在 /home/pi/logs_rrd/update_rrd_data_201709271426.log:
的日志文件中得到的
当前文件夹:/home/pi
日志文件夹:/home/pi/logs_rrd
日志文件:/home/pi/logs_rrd/update_rrd_data_201709271426.log
但是,当我 运行 它作为 cron 作业时,日志文件是在与脚本相同的文件夹而不是 logs_rrd 文件夹中创建的。这是我在 /home/pi/update_rrd_data_201709271445.log:
的日志文件中得到的
当前文件夹:/home/pi
日志文件夹:/home/pi/logs_rrd
日志文件:/home/pi/update_rrd_data_201709271445.log
我不明白为什么日志文件夹的值是正确的,但是日志文件删除了日志文件夹的 logs_rrd 部分。
这就是我 运行 cron 的方式:
*/5 * * * * /usr/bin/python /home/pi/update_rrd_data.py
所有文件夹和文件都归 root 所有,因此不应该有任何写权限问题。
在不起作用的情况下,__file__
可能是绝对路径,所以
log_file = os.path.join(log_folder, file_name)
没有效果,(它返回 file_name
)并保留原始脚本目录。
而不是__file__[:-3]
,只要做:
os.path.basename(os.path.splitext(__file__)[0])
在所有情况下删除脚本文件路径的扩展名(在某些情况下可能不是 .py
顺便说一句) 和 ,所以下一个 os.path.join
命令正常工作。
使用 pathlib
和 Path
对象的替代解决方案(需要 Python 3):
pathlib.Path(__file__).with_suffix('').name
删除目录和文件扩展名的结果相同。