簡體   English   中英

為什么看似有效的Python腳本在通過Windows任務計划程序啟動時無法運行?

[英]Why do seemingly valid Python scripts fail to run when initiated via the Windows Task Scheduler?

我一直在用Python編寫腳本,我想在計划的基礎上自動在Windows服務器上運行。 我非常簡單地嘗試使用批處理文件,但他們熱情地轉而使用Python腳本,並且我們正在使用它們。 我編寫的腳本很容易編寫,當我手動執行它們時,它們完全按照我希望它們執行的操作完成。 我現在編寫了許多不同的腳本,主要處理復制,刪除和重命名文件或移動目錄。

問題是當我嘗試使用Windows任務計划程序安排Python腳本時,其中許多都無法運行(任務計划程序說“上次運行結果= 0x1”)。 這事兒常常發生。 我也有類似批處理文件的經驗(可以手動運行的批處理文件在計划時無法運行)。 鑒於我迄今為止經驗有限,我不得不說這肯定是Windows任務計划程序問題,而不是Python問題。

這是一個示例Python腳本:

#import modules
import os, shutil, datetime, subprocess

#global variables
zip_dir = 'Y:\7z'
zip_dir_misc = 'X:\7z'
zip_extension = '.7z'

def newest_zip_file(directory, extension = zip_extension): 
  return max(
    (os.path.join(dir_name, file_name)
    for dir_name, dir_names, file_names in os.walk(directory)
    for file_name in file_names
    if file_name.endswith(extension)),
    key=lambda fn: os.stat(fn).st_mtime)  

def copy_zip_file(src_dir_p, temp_dir_p):
  src_file = newest_zip_file(src_dir_p)
  new_file = temp_dir_p + '\\' + os.path.basename(src_file)
  shutil.copyfile(src_file, new_file)

copy_zip_file(zip_dir, zip_dir_misc)

此腳本通過網絡文件夾(表示為X:分區)將.7z文件從一個服務器復制到另一個服務器。 此腳本在手動運行時有效,但在計划時則無效。 但是,當更改腳本以將相同的.7z文件復制到同一服務器(而不是聯網文件夾)上的另一個目錄時,無論是手動執行還是計划執行,腳本都可以正常運行。

如果我在上面的腳本中以編程方式做錯了(也許我指的是網絡文件夾不正確)那么我可以一次修復這個腳本(雖然我已經嘗試了我可以想象的每個組合使用類似的東西定義網絡文件夾完整的服務器名稱)。 但是我仍然遇到了完全不同的Python腳本同樣的問題,這些腳本的行為方式相同,這讓我想到了真正的問題:

為什么看似有效的Python腳本在通過Windows任務計划程序啟動時無法運行?

我的Windows任務計划程序配置:

  • 運行用戶是否登錄
  • 以最高權限運行
  • 動作(Python腳本)直接調用(啟動程序:abc.py),不作為參數發送到Python.exe,雖然我已經多次嘗試過Python.exe方法。 我不相信任何一種方法都比另一種更好(只要使計划任務執行),所以我只是直接調用腳本。

我主要尋找解決這個一般問題的建議和最佳實踐,而不是上面發布的示例腳本的具體修復。

您提到了網絡文件夾,這是任務調度程序的已知問題。 有關在Python中處理它的提示,請參閱此文章

通常:

  • 確保將“啟動”屬性設置為“通過任務計划程序GUI”操作中的腳本目錄
  • 在腳本中執行完整的文件引用,包括目錄
  • 如有必要,請在常規設置中以經過身份驗證的用戶身份運行該任務並“以最高權限運行”
  • 由於各種原因,您可以更好地運行任務作為調用python.exe來運行腳本的批處理文件

我對Windows(或其任務計划程序)不是很熟悉,但這聽起來像是在Unix系統上自動運行Python腳本時遇到的典型cron問題。

cron問題的主要原因是不同的環境和腳本在其中運行的不同用戶。 它們難以修復的主要原因是因為開發人員在腳本自動運行時缺少錯誤消息。 為了解決這個問題,我通常使用一個包裝器腳本,它將Python腳本的所有輸出記錄到錯誤日志文件中(只是為了能夠在失敗后看到錯誤消息)。

修復原始問題通常也可以通過包裝器腳本為Python腳本設置正確的環境(變量和內容)來完成。

正如我所說,我的經驗是基於Unix cron,而不是Windows任務計划程序,但問題聽起來非常相似。

幾個筆記:

確保調度程序用於啟動python文件的用戶在其PATH中具有python目錄;

其次,確保用戶也具有網絡權限,並且該用戶也存在安裝

第三,確保從正確的文件夾啟動。 我建議修改腳本以更改為存儲.py文件的工作目錄,或者使用.bat文件啟動,該文件將在啟動python腳本之前更改為工作目錄。

我在Windows Server 2012 R2上遇到了這個問題,我想我找到了這樣的原因:似乎在創建任務時加載了environmnet變量。 因此,如果您正在使用自己的模塊,並且在任務之后設置了PYTHONPATH變量,則任務將始終無法嘗試加載新的python模塊。 我發現的解決方案只是重新創建任務並使用批處理來啟動python腳本。 在我的服務器上工作,我希望它會為你做的伎倆

首先,除非你正確設置窗口,否則windows不知道python或.py文件。 確保你這樣做。

其次,嘗試使用完全最小的python腳本 - 例如,只需觸摸目錄中的文件。 這將告訴您腳本是否正在運行。

第三,如果您認為這是一個Windows問題,那么最好在Superuser或Serverfault上詢問。

我的腳本運行如下:啟動程序:cmd.exe /cc:\\Python27\\python.exe“c:\\ path \\ script.py”以最高權限運行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM