【问题标题】:Having Trouble Executing Python Code in Windows Task Scheduler在 Windows 任务计划程序中执行 Python 代码时遇到问题
【发布时间】:2017-05-02 20:39:28
【问题描述】:

我一直在寻求通过使用 Windows 任务管理器 + Python 来自动生成报告,并且最近编写了一个可以用来运行 .py 文件的脚本。但是,在实践中,它不起作用。我花了两天时间寻找答案并尝试不同的事情,但我一生都无法弄清楚这一点。

场景:我正在尝试编写一个独立的可执行 python 代码,该代码连接到服务器,使用 SQL 提取数据,然后创建一个保存在文件夹中的数据框/数据透视表。这个过程是我想要自动化的。

我当前的代码示例如下

def module():
    sql = "SELECT * FROM TABLE"

    conn = connect(host="url.com", port=xxxxxx)
    cursor = conn.cursor()
    cursor.execute(sql)
    data = as_pandas(cursor)
    todays_date = datetime.datetime.now().date().strftime("%Y%m%d")

    df = data.loc[;,'date','stuff_and_thangs','column1','column2','column3']
    earliest_date = df['date'].min()
    latest_date = df['date'].max()
    df['stuff_and_thangs'] = df['stuff_and_thangs'].astype(float)
    df['stuff_and_thangs'] = df['stuff_and_thangs'].round(decimals = 2)
    df.sort_values(by = 'date', ascending = 'True')
    df.groupby(['date'], sort = True)['stuff_and_thangs','Column1','Column3']

    table = pd.pivot_table(df,index=['Column', 'Column1', 'Column3'], columns =['Column'], values =['Column3'], fill_value = 0)
    writer = pd.ExcelWriter('C:\User\blahblahblah/ %s to %s.xlsx' % (earliest_date, latest_date))
    #Convert the dataframe pivot table to an XlsxWriter Excel object.
    table.to_excel(writer, sheet_name='stuff_and_thangs')

    # Close the Pandas Excel writer and output the Excel file.
    writer.save()

if __name__ == "__main__":
    import pandas as pd
    import numpy as np
    from impala.dbapi import connect
    import datetime
    from impala.util import as_pandas
    module()

额外细节:

假设我的模块代码文件名为 file.py,我有一个批处理文件供任务调度程序运行,如下所示(我们将批处理文件称为“batch.bat”):

start C:\Python27\python.exe file.py

我在 Jupyter Notebook 中编写过代码,现在才开始尝试将它们转换为可执行的独立模块。有没有我可能遗漏的最佳实践?我曾尝试查看环境变量,但它们似乎设置得非常好。该代码在 jupyter notebook IDE 中似乎可以正常工作,但是一旦我将其放入 python 文件中就无法正常工作。

【问题讨论】:

  • 如果您想从命令行运行 Python 脚本,只需导航到您的脚本所在的文件夹,然后运行脚本:C:\MyFolder>python myscript.py。这有帮助吗?
  • 这我已经成功地做到了没有问题。但是,当我尝试在 Windows 任务计划程序中安排这个时,我似乎无法让它工作。
  • 这个start C:\Python27\python.exe C:\YourLocation\file.py怎么样?
  • @Elmex80s,所以这是我目前的设置,但是当我尝试运行它时,命令提示符会立即关闭,并且我需要运行的查询不会运行。当我从 Jupyter Notebook 运行完全相同的代码时,它运行得非常好。

标签: python windows batch-file automation scheduled-tasks


【解决方案1】:

有几件事可能会阻碍您的项目。任务调度程序可能不在您认为的用户安全上下文中运行。这取决于您是否选择了“无论用户是否登录都运行”,是否选择“以最高权限运行”,用户是否实际登录,和/或用户是否设置了本地策略以允许用户运行批处理文件。

如果您选择“无论用户是否登录都运行”或选择“以最高权限运行”,运行它的用户上下文将无法访问网络资源。我只知道解决这个问题的两种方法。不要选择其中任何一个选项并在用户登录且有权访问所需网络资源的机器上运行任务,或者在向网络提供这些资源的服务器上运行任务并使用本地引用来引用它们,例如 C: , D: 等适用于 Windows,而不是 UNC,这在云存储的情况下可能不是一个选项。

Scheduled Task Security Context

Permissions To Run Batch job

【讨论】:

  • 以“最高权限”运行不会阻止网络访问;它使用管理员帐户的无限制链接令牌。如果您尚未将系统策略配置为在 UAC 受限和非受限令牌之间共享 DOS 设备,则这可能是映射网络驱动器的问题。如果没有此策略设置,两个登录会话和关联的 DOS 设备对象目录之间就没有链接。
  • 无论用户是否登录都运行是在会话 0 中的 Batch 登录,因此它需要 SeBatchLogonRight(与 cmd.exe 批处理脚本无关),这通常授予管理员。创建进程的令牌将在其组列表中包含NT AUTHORITY\BATCH SID。如果您存储密码,任务计划程序服务将使用存储凭证的哈希调用LogonUserExExW。否则,它会通过 LsaLogonUser 进行用户服务 (S4U) 登录。 S4U 登录会话只允许使用本地系统资源。
【解决方案2】:

我也有同样的问题。我的程序通过 Jupyter 或 Spyder 启动,但在 Windows 任务计划程序上无法正常运行。

由于打印到标准输出不起作用,我让 Python 创建文件,这有助于缩小问题的范围。试试这个,它帮助我弄清楚这是无法导入的熊猫:

t = open("text11.txt", "wb")
t.close()

import re

t = open("text12.txt", "wb")
t.close()

import pandas as pd

t = open("text19.txt", "wb")
t.close()

...

希望有帮助!

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多