【发布时间】:2013-10-08 23:00:00
【问题描述】:
我有一个简单的 bash 脚本,它允许 cron 在 virtualenv 中执行一系列 Python 脚本。该脚本不断引发No such file or directory 错误。
~/nightly.sh 工作正常:
#!/bin/bash
source virt_env/myproject/bin/activate
cd virt_env/myproject/main
python script1.py
python script2.py
我想将所有内容保留在 ~/virt_env/myproject/main/ 中以简化部署。我想我可以打电话给bash virt_env/myproject/main/nightly.sh:
#!/bin/bash
MAINDIR=`dirname $0`
cd $MAINDIR
source ../bin/activate
python script1.py
python script2.py
但我得到了No such file or directory。如果我手动将cd 改为~/virt_env/myproject/main/,那么我可以运行主要命令没有问题。显然,我错过了 dirname 和 cd 在这种情况下的工作方式。
如何将 bash 指向正确的位置?
解决方案
正如接受的答案中所建议的那样,最好避免从脚本中调用cd,而是使用显式路径变量。这是virt_env/myproject/main/nightly.sh的工作版本:
#!/bin/bash
MAINDIR=`dirname $0`
echo "The main directory is" $MAINDIR
# Activate virtual environment
source $MAINDIR/../bin/activate
# Run Python scripts
python $MAINDIR/python1.py
python $MAINDIR/python2.py
因为现在可以从任意路径调用 Python 脚本,所以我需要更新 Python 脚本以更智能地了解路径感知。
此代码失败,因为os.path.basename 省略了路径信息:
# works when called with "python python1.py"
# fails when called with "python $MAINDIR/python1.py"
CONFIG_FILE = os.path.basename(__file__)[:-3] + ".config"
f = open(CONFIG_FILE,"r")
更新它以使用os.path.abspath 解决了这个问题:
# works regardless of how it is called
CONFIG_FILE = os.path.abspath(__file__)[:-3] + ".config"
f = open(CONFIG_FILE,"r")
【问题讨论】:
-
crontab 条目是什么?
-
我还没有加入 crontab,我只是像 crontab 一样从我的主目录启动 bash 脚本。
标签: python linux bash shell virtualenv