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

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

Thyag 2月前

245 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)
  • 如果我是 Telegram,我会屏蔽任何如此肆无忌惮地使用表情符号的人,但我想这也是我根本不使用 Telegram 的原因。

  • 我有示例日期(必须是 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
    

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

  • 抱歉,butValueError:无效的 isoformat 字符串:'2021-07-23T14:07:21Z'

  • 不是。代码按原样运行。你实际上尝试了什么?你使用的是哪个 Python 版本?

  • 只是为了让评论部分的每个人都安心;在 RF 中并使用 python 标准库:

    *** Settings ***
    
    *** Variables ***
    ${DATE1}        2021-07-23T14:07:21Z
    ${DATE2}        2021-07-23T16:07:21+02:00
    
    
    *** Keywords ***
    Convert Date From Iso Format
      [Documentation]      fromisoformat() requires python 3.11 for certain formats!
      [Arguments]    ${dt}
      ${ret}=   Evaluate   datetime.datetime.fromisoformat("${dt}")   modules=datetime
      RETURN   ${ret}
    
    
    *** Test Cases ***
    Compare the dates take 1
        [Documentation]    Compares DATE1 and DATE2 variables by converting them to datetime objects
        ...                and using builtin Should Be Equal keyword
        ${newdate1}        Convert Date From Iso Format    ${DATE1}
        ${newdate2}        Convert Date From Iso Format    ${DATE2}
        Should Be Equal    ${newdate1}    ${newdate2}
    
    Compare the dates take 2
      [Documentation]    Compares DATE1 and DATE2 variables by converting them to datetime objects and using Evaluate keyword
      ...                to compare them and returns boolean value to be used in Should Be True keyword
      ${ret}=   Evaluate   datetime.datetime.fromisoformat("${DATE1}")==datetime.datetime.fromisoformat("${DATE2}")   modules=datetime
      Should Be True    ${ret}
    
  • 我试图将空间天气指数可视化为轮廓填充图,其中 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

  • 怎么可能它对你有用,但对我没用?:) 比较日期取 1 :: 比较 DATE1 和 DATE2 变量...... | 失败| 评估表达式'datetime.datetime.fromisoformat(\'2021-07-23T14:07:21Z\')'失败:ValueError:无效的 isoformat 字符串:'2021-07-23T14:07:21Z' 比较日期取 2 :: 比较 DATE1 和 DATE2 变量...... | 失败|评估表达式 'datetime.datetime.fromisoformat(\'2021-07-23T14:07:21Z\')==datetime.datetime.fromisoformat(\'2021-07-23T16:07:21+02:00\')' 失败:ValueError:无效的 isoformat 字符串:'2021-07-23T14:07:21Z'

  • A.J 2月前 0 只看Ta
    引用 9

    因为我运行的是 3.11 - 这只适用于 3.11 及以上版本 docs.python.org/3/whatsnew/3.11.html#datetime

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

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

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

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

  • @rasjani 我已经通过某种解决方法解决了这个问题:) def parse_rfc3339_date(d): if d.endswith(\'Z\') or d.endswith('z'): d=re.sub('[Zz]$', '+00:00',d) return datetime.fromisoformat(d) else: return datetime.fromisoformat(d) Cheers

  • Robot Framework 有 DateTime 库 。不确定它是否可以用于您的情况。如果不行,那么您可以在 Python 中创建自己的关键字,将日期转换为 UTC,并使用 BuiltIn Should Be Equal 关键字比较 RF 中的日期。

    例子 date_convert.py

    from datetime import datetime, timedelta, timezone
    
    def convert_date_to_utc(datetime_stamp):
        dt = datetime.fromisoformat(datetime_stamp)
        dt_utc = dt - dt.utcoffset()
        formatted_utc = dt_utc.strftime("%Y-%m-%d %H:%M:%S")
        return formatted_utc
    

    例子 date_compare.robot

    *** Settings ***
    Library        DateTime
    Library        test.py
    
    *** Variables ***
    ${DATE1}        2021-07-23T14:07:21Z
    ${DATE2}        2021-07-23T16:07:21+02:00
    
    *** Test Cases ***
    Compare the dates
        ${newdate1}        Convert Date    ${DATE1}    result_format=%Y-%m-%d %H:%M:%S
        ${newdate2}        test.Convert Date To Utc    datetime_stamp=${DATE2}
        Should Be Equal    first=${newdate1}    second=${newdate2}
    

    这导致了 PASS 。希望这会有所帮助。

  • datetime 是内置的 Python 库,而不是 Robot Framework 库。UTC 也不是一种格式,它是 00:00 时区偏移量的时间。convert_date_to_utc 并没有实现它所声称的功能,fromisoformat 之后的任何东西都没有任何用处

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

    我正在努力解决一个可能相当简单的问题。给定一个特定的 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

  • @PanagiotisKanavos DateTime 也是 Robot Framework 的内置库。它确实在底层利用了 datetime 和 time,因为它主要是基于 Python 的 DSL。

  • 从 datetime import datetime、timedelta、timezone 导入 Python 库。datetime.fromisoformat 是内置的 Python 方法,返回一个时区感知的 datetime 对象。没有理由转换为本地时间,更不用说字符串,以比较时区感知的 datetime 值。datetime.fromisoformat('2021-07-23T14:07:21Z')==datetime.fromisoformat('2021-07-23T16:07:21+02:00') 返回 True

  • 是的,而且?您的评论在说 DateTime 不是内置的 Robot Framework 关键字库时仍然不合事实。请理解这一点;您的代码在纯 Python 中 100% 正确,但在 RF 的上下文中 - 可能存在一些您可能不清楚的复杂之处?

  • @JohnathanBarclay 如果他的最小最大允许 12 月、1 月和 2 月(因此跨越新年)那么 8 月超出范围了?

  • @JohnathanBarclay 你能详细说明一下吗?我原以为 11 月 30 日至 1 月 31 日之间的任何时间都不属于这个时间段。

  • 引用 20

    我将 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 中的变化,它们与文档有关

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

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

返回
作者最近主题: