解决“没有这样的文件或目录”的问题。不使用绝对路径?

时间:2014-12-28 00:22:50

标签: python ubuntu cron

我在/home/dmbot/

中有一个Python脚本

/home/dmbot/的内容是:

root@alpha:~/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

当我在/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服务器不同。

有解决方法吗?

3 个答案:

答案 0 :(得分:4)

您可以设置crontab以在运行脚本之前将目录更改为运行所需的位置:

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

然后在另一台计算机上,只需将crontab设置为cd到你需要的地方。

答案 1 :(得分:1)

Cron通常在root / 上运行。所以你的脚本可能正在那里运行。现在你有两个选择。在脚本中设置绝对路径或创建另一个python文件,作为配置文件,在那里创建变量并将其包含在脚本中。变量包括当然的路径。这样,您只需维护一个脚本,而不需要在任一服务器上触及配置文件。

答案 2 :(得分:0)

所以,@ dtor的解决方案是有效的,但如果不要求人们知道他们必须从/ home / dmbot运行你的脚本,你就会更安全,你只需要让你的脚本能够计算出来你的&#34;令牌&#34; directory是相对于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瞧,现在您可以从任何工作目录运行您的脚本并且没有问题,以后您不再需要记住必须记住您运行该脚本的特定位置的问题。

相关问题