我在/home/dmbot/
/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服务器不同。
有解决方法吗?
答案 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瞧,现在您可以从任何工作目录运行您的脚本并且没有问题,以后您不再需要记住必须记住您运行该脚本的特定位置的问题。