2014-12-28 131 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瞧,现在你可以从任何工作目录运行脚本,没事的,并且之后不再需要记住要从中运行该脚本的特定位置。

相关问题