【问题标题】:Python os.path.join() not joining properly when using cron job使用 cron 作业时 Python os.path.join() 无法正确加入
【发布时间】:2017-09-28 03:29:46
【问题描述】:

我在 /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__ 代替inspect.stack()[0][1]
  • @AndMar 是的,我做了,但是当前文件夹变成了 /root。此外,无论哪种方式,当前文件夹和日志文件夹的值都是正确的。当我尝试将文件名组合到日志文件夹时,它的行为很奇怪并删除了“logs_rrd”部分。

标签: python logging cron raspbian raspberry-pi3


【解决方案1】:

如果不起作用,__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 命令可以正常工作。

使用pathlibPath 对象的替代解决方案(需要Python 3):

pathlib.Path(__file__).with_suffix('').name

删除目录和文件扩展名,结果相同。

【讨论】:

  • 我已经偏爱pathlib.Path,所以p = pathlib.Path(__file__) 然后只是p.with_suffix('').name 所以os.path.blahblahblah(os.path.bloop(path)[0])更具可读性
  • 我一直用os.path,不过没关系。
  • 同样,直到最近我才开始使用它,但它有很多很棒的功能。 它重载了/ 运算符,而不是os.join(并使其作为方法可用)!!!值得一试:docs.python.org/3/library/pathlib.html
  • 快速浏览了一下,确实不错。感谢您指出了这一点。 / 运算符是一个很好的补充。
  • pathlib 听起来很酷,但我应该提到我使用的是 python 2.7,所以我不能使用它..
猜你喜欢
  • 2013-04-29
  • 2014-07-09
  • 2012-11-07
  • 2021-06-18
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多