2012-06-21 61 views
1

我一直在寫的Python腳本,我想計劃的基礎上在Windows服務器上自動運行。我嘗試了很多簡單的批處理文件,但是卻熱心地轉向Python腳本,並且對它們做的很好。我編寫的腳本很容易編寫,而且當我手動執行它們時,它們正是我想要它們執行的操作。我現在寫了許多不同的腳本,主要處理複製,刪除和重命名文件或移動目錄。爲什麼通過Windows任務計劃程序啓動時看似有效的Python腳本無法運行?

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

下面是一個例子Python腳本:從一個服務器到另一個經由聯網的文件夾(:分區表示爲X)

#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) 

此腳本副本.7z壓縮文件。此腳本在手動運行時工作,但在計劃時不運行。然而,當劇本更改爲同一.7z壓縮文件複製到同一臺服務器(不是網絡文件夾)上的另一目錄,該腳本將工作得很好,無論是在手動執行或計劃。

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

爲什麼看起來有效的Python腳本在通過Windows任務計劃程序啓動時無法運行?

我的Windows任務調度程序配置:

  • 用戶運行是否登錄或不
  • 直接稱爲最高權限
  • 操作(Python腳本)運行(啓動程序:abc.py) ,沒有作爲參數發送給Python.exe,儘管我已經多次嘗試了Python.exe方法。我不相信任何一種方法都比另一種更好(只要執行計劃任務),所以我只是直接調用腳本。

我找多爲建議和解決這個普遍問題的最佳做法,並沒有那麼多具體的修復上面張貼的示例腳本。

+0

你使用IDLE嗎?我知道我必須將IDLE設置爲使用Task Scheduler時以管理員身份運行。 – JasonBK

+0

沒有。我當時沒有使用IDLE,但我仍然不使用它。我不認爲這應該是一個要求。 – nairware

回答

5

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

一般:

  • 確保您設置屬性「在啓動」中通過任務計劃程序GUI
  • 的動作腳本目錄的腳本中做完整的文件引用,包括目錄
  • 如有必要,以通過身份驗證的用戶身份運行任務,並在常規設置中運行「最高權限」
  • 由於各種原因,您可能會有更好的運氣將該任務作爲調用python.exe運行腳本的批處理文件運行
+0

你的第一點使它適合我。你能解釋一下「開始」的含義嗎? – Ray

+0

[鏈接到的帖子](http://coredumpelf.wordpress.com/2011/04/04/windows-2008-task-scheduler-issues-with-mapped-drives/)對於任何使用映射驅動器的人來說都是必不可少的讀物。 – pianoJames

+1

@Ray:我認爲如果你不指定「開始」,那麼腳本將運行在相對於C:\ Windows \ System32或類似的地方。 [這](https://serverfault.com/questions/426519/why-is-start-in-needed-for-windows-scheduled-tasks)可能有更多的信息。 – pianoJames

2

我不是很熟悉Windows(或它的任務計劃程序),但它聽起來像是你試着把在UNIX系統上的自動化庫運行​​Python腳本時進入典型的cron問題。

的主要原因cron的問題是不同的環境和不同的用戶腳本並下運行。他們很難解決的主要原因是開發人員在腳本自動運行時缺少錯誤消息。爲了解決這個問題我通常使用的包裝腳本記錄的Python腳本的所有輸出到一個錯誤日誌文件(僅僅是爲了能夠看到後失敗的錯誤消息)。

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

正如我所說,我的經驗是基於UNIX的cron,而不是在Windows任務計劃程序,但問題聽起來很相像。

-1

首先,除非你設置窗口不當,窗戶一無所知Python或.py文件的。確保你這樣做。

所有第二,試試這一個完全最小的python腳本 - 比如一個簡單地觸摸在目錄中的文件。這會告訴你,如果你的腳本正在運行。

第三,如果你認爲這是一個Windows的問題,那麼它很可能是更好的要求,在超級用戶或Serverfault。

1

有兩點要注意:

確保其調度使用來啓動Python文件,用戶在其路徑蟒蛇目錄;

其次,確保用戶還具有網絡權限,安裝存在着對用戶以及

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

1

我的Windows Server 2012 R2運行到這個問題,我想我找到behin這樣做的原因: 看來,environmnet變量在創建任務的加載。因此,如果您正在使用自己的模塊,並且在任務之後設置了PYTHONPATH變量,那麼任務將始終無法加載新的python模塊。 我找到的解決方案只是簡單地重新創建任務並使用批處理啓動python腳本。在我的服務器它的作品,我希望它會做的伎倆爲您

-1

我的腳本運行是這樣的: 啓動程序: CMD.EXE /cc:\Python27\python.exe「C:\路徑\腳本.py「 以最高權限運行

相關問題