2014-12-28 59 views
1

我有/home/dmbot/解決'沒有這樣的文件或目錄'沒有使用絕對路徑?

/home/dmbot/裏面的內容的Python腳本是:

[email protected]:~/dmbot# ls -lah 
total 40K 
-rw-r--r-- 1 root root 1.7K Dec 27 18:14 accounts.py 
-rw-r--r-- 1 root root 185 Dec 27 18:14 config.py 
drwxr-xr-x 2 root root 4.0K Dec 27 18:14 followers 
-rwxr-xr-x 1 root root 1.8K Dec 27 18:35 script.py 
drwxr-xr-x 2 root root 4.0K Dec 27 18:14 tokens 

當我從shell中運行我的腳本,而我在/home/dmbot/,它工作正常,但我試圖從cron運行它。

我加入這一行對我的crontab:

12 19 * * * /usr/bin/python /root/dmbot/script.py 

當cron的運行,我得到這個在我的根電子郵件:

Traceback (most recent call last): 
    File "/root/dmbot/script.py", line 5, in <module> 
    execfile('tokens/acc1.py', globals()) 
IOError: [Errno 2] No such file or directory: 'tokens/acc1.py' 

既然當我從shell中執行它工作正常,爲什麼cron在運行時不工作?我必須爲我的整個腳本設置絕對路徑嗎?

我在本地計算機上編寫了腳本,現在我將其上傳到Ubuntu服務器。如果我在整個腳本上設置絕對路徑,我將不得不維護兩個腳本,因爲我的計算機的文件夾結構與Ubuntu服務器不同。

是否有解決方法?

+0

可能是一個愚蠢的問題,但是在'tokens'子目錄中確實有一個名爲'acc1.py1'的文件? –

+0

Hi @JustinLardinois, 是的,因爲當我從shell運行腳本時,它工作正常。 'root @ alpha:〜/ dmbot/tokens#ls acc1.py acc2.py acc3.py acc4.py acc5.py acc6.py' – viniciusmunich

回答

4

您可以設置crontab來更改目錄到你需要它從之前運行該腳本運行:在其他計算機上

12 19 * * * cd /home/dmbot ; ./script.py 

然後,只需設置的crontab到CD,無論你需要它那裏。

+0

這有效。謝謝! – viniciusmunich

1

Cron通常在根上運行/。所以你的腳本可能在那裏運行。現在你有兩個選擇。要麼在腳本中設置絕對路徑,要麼創建另一個python文件作爲配置文件,在那裏創建變量並將其包含在腳本中。該變量包括當然的路徑。這樣,您只需維護一個腳本,而無需在任一服務器上觸摸配置文件。

0

因此,@ dtor的解決方案能夠工作,但如果不是要求人們知道他們必須從/ home/dmbot運行腳本,而是讓腳本能夠找出您的「令牌「目錄是相對於script.py。這樣,您可以從任何地方運行script.py,或者將整個項目移動到/ home/dmbot以外的目錄而不會破壞任何內容。您可以通過搞清楚當前文件所在,並基於關閉該在您的令牌目錄位於如下做到這一點:

import sys 
import os 
abs_script_dir = os.path.dirname(os.path.abspath(__file__)) 
execfile(os.path.join(abs_script_dir, 'tokens/acc1.py'), globals()) 

的Et瞧,現在你可以從任何工作目錄運行腳本,沒事的,並且之後不再需要記住要從中運行該腳本的特定位置。

相關問題