8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

通过 Crontab 运行 Python 脚本不起作用

Thyag 2月前

251 0

因此,我编写了一个脚本来汇总一些新闻通讯并通过 Telegram 发送给我。该脚本本身运行完美。现在我尝试每天早上 7 点通过 Ubun 上的 crontab 运行此脚本...

因此,我编写了一个脚本来汇总一些新闻通讯并通过 Telegram 发送给我。该脚本本身运行完美。现在,我尝试每天早上 7 点通过 Ubunutu 服务器上的 crontab 运行此脚本。日志文件看起来不错,我在脚本中使用的每个 print() 都正常显示而没有错误,但它不会发送消息。

我的 Crontab 命令:

00 12 * * * DISPLAY=:0 /usr/bin/python3 /root/data/App/Briefing/main.py >> /home/main.log &2>1

Python 脚本:

主程序

import ai as AiHandler
import mail as MailHandler
import send as Telegram
import pandas as pd
from datetime import date
def start():
    files = MailHandler.scanEmails()
    files = AiHandler.summarize(files)

    print(files)

    data = pd.read_csv('checkpoint.csv', sep=';')
    checkpoint = createMsg(data)

    s = f"morgentliches Briefing vom {date.today().strftime("%d.%m.%Y")}".replace(".", "\\.")

    s += "\n\n\n  *Die* *Lage* *am* *Morgen* *\\-* *Spiegel*\n\n\n" + createMsg(pd.read_csv('spiegel.csv', sep=';'))

    s += "\n\n\n  *Berlin* *\\-* *Tagesspiegel* *Checkpoint*\n\n\n" + checkpoint

    s += "\n\n\n *Tech* *Update* *\\-* *ManagerMagazin* \n\n\n" + createMsg(pd.read_csv('manager.csv', sep=';'))  


    Telegram.sendMessage(s)
    

def createMsg(data):

    s = ""

    for i in range(5):

        thema = data['Thema'][i].replace('*', '\\*')
        zsm = data['Zusammenfassung'][i].replace('*', '\\*')

        s += "\t" + "*" + thema + "*" + "\n"
        s += zsm + "\n"
    
    s = s.replace("-", "\\-")
    s = s.replace(".", "\\.")
    s = s.replace("(", "\\(")
    s = s.replace(")", "\\)")
    #s = s.replace("*", "\\*")
    s = s.replace("!", "\\!")

    return s
start()

发送.py

import telebot

def sendMessage(msg):
    bot = telebot.TeleBot("XXXXXX")
    bot.send_message(chat_id="@morgenbriefing", text=msg, parse_mode="MarkdownV2")

我尝试将 DISPLAY:=0 添加到 crontab 命令中,但没有帮助

帖子版权声明 1、本帖标题:通过 Crontab 运行 Python 脚本不起作用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Thyag在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 这是我的示例:import pandas as pdimport datetimemy_df = pd.DataFrame({'date_clmn': [datetime.date(2020, 1, 1), datetime.date(2020, 2, 1), ...

    以下是我的示例:

    import pandas as pd
    import datetime
    my_df = pd.DataFrame({'date_clmn': [datetime.date(2020, 1, 1),
                                        datetime.date(2020, 2, 1),
                                        datetime.date(2020, 3, 1)]})
    my_df['lag_date'] = my_df.date_clmn - pd.DateOffset(months = 3)
    my_df.lag_date.dt.date
    

    最后一行产生错误:

    AttributeError: Can only use .dt accessor with datetimelike values
    

    据我所知, dt 访问器应该与时间戳一起使用。为什么它会产生错误消息?

    更新

    为了确认数据类型,我运行了:

    my_df.lag_date.apply(type)
    

    返回结果:

    0    <class 'pandas._libs.tslibs.timestamps.Timesta...
    1    <class 'pandas._libs.tslibs.timestamps.Timesta...
    2    <class 'pandas._libs.tslibs.timestamps.Timesta...
    Name: lag_date, dtype: object
    
  • 我该如何设置日期所需的星期几?使用 DateTime 还是 Jiffy?如果不能使用这些库,也可以使用其他库。例如,在 Kotlin 上使用 Joda DateTime,我可以这样做

    我如何设置日期所需的星期几?使用 DateTime 还是 Jiffy?如果不能使用这些库,也可以使用其他库。

    例如,在带有 Joda DateTime 的 Kotlin 上,我可以这样做:

    scheduleDate.withField(DateTimeFieldType.dayOfWeek(), 3) // set weekday Wednesday
    

    在 Flutter 上可以做同样的事情吗?

  • 我需要将 jpg 格式的数据集图像及其对应的标签导入到 csv 文件中,该文件的第一列包含您的图像名称,第二列和第三列包含宽度和高度。如何...

    我需要将 jpg 格式的数据集图像及其对应的标签导入到 csv 文件中,该文件的第一列包含您的图像名称,第二列和第三列包含宽度和高度。如何输入这样的数据集并训练我的机器学习模型,以便训练 ResNet50 模型来预测类别和对应的标签?我将如何划分数据以进行训练、验证和测试?

  • 我将 rails 从 5.2 更新到了 5.2.8:gem 'railties', '~> 5.2.8.1 'gem 'actionpack', '~> 5.2.8.1 'gem 'actionmailer', '~> 5.2.8.1 'gem 'activejob', '~> 5.2.8.1 'gem 'activerecord', '~&...

    我将 Rails 从 5.2 更新到了 5.2.8:

    gem 'railties', '~> 5.2.8.1 '
    gem 'actionpack', '~> 5.2.8.1 '
    gem 'actionmailer', '~> 5.2.8.1 '
    gem 'activejob', '~> 5.2.8.1 '
    gem 'activerecord', '~> 5.2.8.1 '
    gem 'activesupport', '~> 5.2.8.1 '
    

    我分析了此版本中的变化,发现活动记录设置中增加了更多内容,这些内容不会影响应用程序的行为,因为我没有添加这些新设置

    但是测试失败了,因为更新前 0.days 返回了 0 秒,更新后返回了 0 天,我分析了 gemfile.lock 以检查下面是否安装了任何依赖项,但唯一可以改变行为的是 gem 数据 3.3.4,但我检查了这个 gem 中的变化,它们与文档有关

    它只破坏了一项测试,但我担心这种行为会影响整个应用程序

    这可能是什么问题?我该如何解决?

  • 我正在努力解决一个可能相当简单的问题。给定一个特定的日期时间,我如何验证这个日期(不考虑年份)是否位于其他两个日期之间?例如:

    我正在努力解决一个可能相当简单的问题。给定一个特定的 DateTime ,我如何验证这个日期(不考虑其年份)是否位于另外两个日期之间?

    一个例子:

    DateTime toCheck = new DateTime(1900, 3, 4);
    DateTime min = new DateTime(2024, 1, 1);
    DateTime max = new DateTime(2024, 12, 31);
    // True - 'toCheck' is between 'min' and 'max'
    

    在上面的代码片段中, toCheck 介于 min max 因为 4 月 3 日 介于 1 月 1 日 12 月 31 日 。我可以用类似这样的代码轻松验证这一点 new DateTime(min.Year, toCheck.Month, toCheck.Day) >= min && new DateTime(max.Year, toCheck.Month, toCheck.Day) <= max; .

    然而,我意识到当年份重叠时,情况会变得更加复杂。例如,在以下情况下, 1 月 1 日 位于 12 月 1 日 2 月 1 日 ,但我的检查失败了(显然)。

    DateTime toCheck = new DateTime(1900, 1, 1);
    DateTime min = new DateTime(2024, 12, 1);
    DateTime max = new DateTime(2025, 2, 1);
    // False - but should actually be True :(
    

    我就是想不出如何写出一个通用的、万无一失的解决方案。任何帮助我都非常感谢。

    链接到 dotnetfiddle.net

  • BuildFire 似乎没有任何关于通过 CSV 文件批量导入用户的明确文档,除了“使用导入模板”我们正尝试从其他地方批量上传用户……

    BuildFire 似乎没有任何关于通过 CSV 文件批量导入用户的明确文档,除非使用导入模板。我们正尝试从另一个集成系统批量上传用户,并使用其他系统的密码以 base64 加密,并将 passwordHashType 字段设置为 base64 我们的第一个测试是更新现有用户,因此覆盖现有用户字段标记为“是”。

    每次尝试导入此单行文件都会返回响应“导入时出现错误”,并且返回的错误文件仅包含一个不起眼的错误“无效登录”。

    有人能给我指出一些有关 BuildFire 用户导入程序的具体文档吗?BuildFire University 似乎没有关于此主题的任何内容。我甚至没有找到任何有关 passwordHashType 的哪些值可能真正有效的文档。

  • 我试图将空间天气指数可视化为轮廓填充图,其中 x 轴为日期,y 轴为小时,值为 dst。到目前为止,我已经使用我的代码成功创建了以下图:......

    我试图将空间天气指数可视化为轮廓填充图,其中 x 轴为日期,y 轴为小时,值为 dst。

    到目前为止,我已经使用我的代码成功创建了以下图表:

    注意:dst 是根据链接中给出的数据集创建的数据透视表: https://drive.google.com/file/d/1cz5i2n6zGGsQVDejRpteai8Zs07_58vL/view?usp=sharing

    fig, axes = plt.subplots(nrows=2, figsize=(8,5), )
    
    ct = axes[0].contourf(dst, cmap="coolwarm_r", extend="both", )
    ct_kp = axes[1].contourf(kp, cmap="coolwarm", extend = "both")
    
    add_colorbar(fig, axes[0], ct, "nT")
    add_colorbar(fig, axes[1], ct_kp, "kp")
    
    for ax in axes:
        ax.set_ylabel("Hour")
        ax.axvline(30, color="black", linestyle="--")
    
    axes[1].set_xticklabels(["-30", "-25", "-20", "-15", "-10", "-5", "EQ", "5", "10", "15"]);
    axes[1].set_xlabel("Days")
    
    fig.tight_layout()
    

    result

    现在我想在 x 轴上设置日期,每个主要刻度之间间隔 5 天,但无法这样做。

    以下是我迄今为止尝试过的!

    import matplotlib.dates as mdates
    ax.set_xticks(dst.columns)
    

    但由于某些原因,我得到了以下数字:

    enter image description here

  • 我有示例日期(必须是 RFC3339 格式)2021-07-23T14:07:21Z接下来有一个端点需要该日期让我们说/setdateNext我想使用另一个端点验证它是否设置正确...

    我有示例日期(必须是 RFC3339 格式) 2021-07-23T14:07:21Z

    接下来有一个端点需要该日期,比如说/setdateNext,我想使用另一个端点/getdate作为示例来验证它是否设置正确。问题是第二个端点返回这个日期,因为它 2021-07-23T16:07:21+02:00 实际上是相同的日期,但它的字符串不同,所以我不能简单地在机器人框架中比较这两个。是否有任何机器人框架关键字来创建两个日期对象,当我们比较它们的值时它们会相同?

    编辑:

    这怎么可能?

    Documentation:  
    
    Fails if the given objects are unequal.
    Start / End / Elapsed:  20240513 21:06:22.031 / 20240513 21:06:22.031 / 00:00:00.000
    21:06:22.031    DEBUG   Argument types are:
    <class 'datetime.datetime'>
    <class 'datetime.datetime'>     
    21:06:22.031    FAIL    2021-07-23 14:07:21+02:00 != 2021-07-23 12:07:21
    

    我怎样才能比较两个日期时间对象,因为它们不是字符串???

    另一个大问题 xDDD

    def main():
        d1 ='2021-07-23T14:07:21+00:00'
        d2='2021-07-23T14:07:21Z'
        res = compare_rfc_dates(d1, d2)
        print(res)
    

    印刷:

    2021-07-23 14:07:21+00:00 2021-07-23 14:07:21
    False
    

    与日期时间对象进行比较。有人可以解释一下这是什么意思吗?

  • 在将 s 转换为 时 date 存在问题 datetimes ,但是在循环中,因此最终创建的不是 TimeSeries s Timestamp 的对象

    my_df['lag_date'] = my_df.date_clmn - pd.DateOffset(months = 3)
    print (my_df.lag_date.apply(type))
    0    <class 'pandas._libs.tslibs.timestamps.Timesta...
    1    <class 'pandas._libs.tslibs.timestamps.Timesta...
    2    <class 'pandas._libs.tslibs.timestamp
    

    可能的解决方案是先将 dates s 转换为 datetime s :

    my_df['lag_date'] = pd.to_datetime(my_df.date_clmn) - pd.DateOffset(months = 3)
    print (my_df.lag_date.dt.date)
    0    2019-10-01
    1    2019-11-01
    2    2019-12-01
    Name: lag_date, dtype: object
    

    或者最后:

    my_df['lag_date'] = pd.to_datetime(my_df.date_clmn - pd.DateOffset(months = 3))
    print (my_df.lag_date)
    0   2019-10-01
    1   2019-11-01
    2   2019-12-01
    Name: lag_date, dtype: datetime64[ns]
    
  • 您可以创建一个扩展, DateTime 以便能够直接在对象上使用它:

    extension DateTimeWeekday on DateTime {
      DateTime setWeekday(final int weekday) {
        final int current = this.weekday;
    
        // If the day of the week is already past the current value, set it to the next week's day.
        final int desired = current <= weekday ? weekday : weekday + 7;
    
        final int diff = desired - current;
        return this.add(Duration(days: diff));
      }
    }
    
  • List<DateTime> weekDates(DateTime? fromDate) {
        final result = [];
    
    
        final DateTime currentDate = fromDate == null ? DateTime.now() : fromDate;
    
    
        DateTime firstDay=fromDate!.subtract(Duration(days: fromDate.weekday-1));
    
        for(int x=0;x<=6;x++)
        {
          DateTime currentDate=firstDay.add(Duration(days: x));
    
          result.add(currentDate);
           
          
        }
    
    
    
        return result;
      }
    
  • 还要检查或条件,以及最大日期年份,以查看较小和较大条件。它将处理每一种情况。

    if((new DateTime(min.Year, toCheck.Month, toCheck.Day) >= min  
        && new DateTime(max.Year, toCheck.Month, toCheck.Day) <= max)
    ||
        (new DateTime(max.Year, toCheck.Month, toCheck.Day) >= min 
        && new DateTime(max.Year, toCheck.Month, toCheck.Day) <= max)
    )
    {
    // Code for true condition
    }
    
  • 我认为可以采用以下方法:

    import 'package:flutter/material.dart';
    
    DateTime setDateForDayOfWeek(DateTime date, int desiredDayOfWeek) {
      int difference = desiredDayOfWeek - date.weekday;
      
      /// Adjust the difference if it's negative
      if (difference < 0) {
        difference += 7;
      }
      
      return date.add(Duration(days: difference));
    }
    
    void main() {
      DateTime currentDate = DateTime.now();
      
      /// Setting the desired day of the week (e.g., Wednesday = 3)
      int desiredDayOfWeek = 3;
      
      DateTime desiredDate = setDateForDayOfWeek(currentDate, desiredDayOfWeek);
      
      print('Desired Date: $desiredDate');
    }
    
  • VAN 2月前 0 只看Ta
    引用 15

    一种方法是提取范围内的年份,并将该年份应用到日期以检查其是否在范围内。

    public static bool IsBetween(DateTime min, DateTime max, DateTime toCheck)
    {
        var numberOfYears = max.Year - min.Year + 1;
        for (int i = 0; i < numberOfYears; i++)
        {
            var date = new DateTime(min.Year + i, toCheck.Month, toCheck.Day);
            if (date >= min && date <= max)
                return true;
        }
        return false;
    }
    
  • 您可以使用此类,它应该可以按预期工作:

    public class DateRangeEvaluator
    {
        public DateRangeEvaluator(DateOnly minDate, DateOnly maxDate)
        {
            if (minDate > maxDate) throw new ArgumentException("MinDate must not be greater than MaxDate");
            MinDate = minDate;
            MaxDate = maxDate;
        }
    
        public DateOnly MinDate { get; }
        public DateOnly MaxDate { get; }
    
        public bool IsBetween(DateOnly checkDate)
        {
            if (MinDate.Year != MaxDate.Year)
            {
                bool checkMaxDate = checkDate.Month < MinDate.Month;
                int newCheckDateYear = checkMaxDate ? MaxDate.Year : MinDate.Year;
                checkDate = new(newCheckDateYear, checkDate.Month, checkDate.Day);
                return checkMaxDate ? checkDate <= MaxDate : checkDate >= MinDate;
            }
    
            DateOnly compareDateMin = new(checkDate.Year, MinDate.Month, MinDate.Day);
            DateOnly compareDateMax = new(checkDate.Year, MaxDate.Month, MaxDate.Day);
            return checkDate >= compareDateMin && checkDate <= compareDateMax;
        }
    }
    

    一些测试,包括你的测试:

    DateRangeEvaluator validator = new(new(2024, 12, 1), new(2025, 2, 1));
    DateOnly startDate = new(1900, 10, 1);
    foreach (var date in Enumerable.Range(0, 6).Select(startDate.AddMonths))
    {
        bool isInBetween = validator.IsBetween(date);
        Console.WriteLine($"Date: {date} between {validator.MinDate} and {validator.MaxDate}: {isInBetween}");
    }
    

    测试: https://dotnetfiddle.net/HTa1Jx

  • 方法依据 DayOfYear

    public static bool Check(DateTime toCheck, DateTime min, DateTime max)
            => Check(toCheck.DayOfYear, min.DayOfYear, max.DayOfYear);
        
    public static bool Check(int toCheck, int min, int max)
    {
        return min <= max
            ? min <= toCheck && toCheck <= max
            : !(min > toCheck && toCheck > max); // min and max are on opposite side of new year
    
            // in the latter case we test that the
            // check date is NOT BETWEEN max and min 
            // the condition can also be written as
            // min <= toCheck || toCheck <= max
        }
    }
    

    根据您的示例运行: https://dotnetfiddle.net/Cca1Uz 结果是

    true
    true
    

    我没有测试闰年,但你在评论中说,你会单独处理这个问题。
    请注意, 萨尔曼的回答 类似,但解决了这个问题。

    注意: This assumes a period strictly < 1 year.

  • 绝妙的解决方案!我扩展了您的答案,添加了 if (min.AddYears(1) <= max) is_between = true 以允许范围 >1 年。

  • @shigo 我猜 OP 有一个每年在特定月日间隔内重复发生的事件列表。例如,toCheck 日期可以是今天的日期,即 2024 年 2 月 29 日。开始日期和结束日期需要以特定格式指定,例如,如果事件发生在“整个二月”,则 min 和 max 必须设置为 [2000-02-01, 2000-02-29](任何有 2 月 29 日的年份)。该逻辑适用于这种情况。我会尝试提出一些测试。

  • 使用 DateTime.toString 格式化日期。它应该是 4 位数字零填充字符串,例如。1 月 31 日将是 0131。

返回
作者最近主题: