我有一个Python脚本,说myscript.py
,使用相对模块导入,即from .. import module1
,在我的项目布局如下:如何运行从任何位置调用Python脚本的Bash脚本?
project
+ outer_module
- __init__.py
- module1.py
+ inner_module
- __init__.py
- myscript.py
- myscript.sh
而且我有一个bash脚本,说myscript.sh
,这是一个包装我的python脚本,如下图所示:
#!/bin/bash
python -m outer_module.inner_module.myscript [email protected]
这工作执行myscript.py
并根据需要将参数转发给我的剧本,但是当我打电话./outer_module/inner_module/myscript.sh
从project
DIRECTO内它只能如上所示。
如何让这个脚本可以在任何地方工作?例如,我如何让这项工作拨打电话bash /root/to/my/project/outer_module/inner_module/myscript.sh
?
这里是我的尝试:
当从其他地方执行myscript.sh
,我得到的错误:No module named outer_module.inner_module
。然后我尝试另一种方法可以从任何地方执行bash脚本,用替换myscript.sh
:
#!/bin/bash
scriptdir=`dirname "$BASH_SOURCE"`
python $scriptdir/myscript.py [email protected]
当我执行myscript.sh
如上图所示,我得到如下:
Traceback (most recent call last):
File "./inner_module/myscript.py", line 10, in <module>
from .. import module1
ValueError: Attempted relative import in non-package
这是由于如前所述,在myscript.py
的第一行的相对进口,即from .. import module1
。
尝试:'(CD $ && SCRIPTDIR蟒蛇./devicelist.py $ @)' – ryanpattison 2014-11-04 23:55:50
你的工作目录必须是'outer_module'所在的目录,而不是'outer_module'本身;否则'outer_module'不是一个包(因此是例外)。 (这很难做得太精确,因为你似乎已经在问题的中途切换了所有的名字,但是如果你在'inner_module'里面,那就是同样的问题。) – abarnert 2014-11-04 23:59:15
或者,您只需不要在这些目录的_any_中,并在运行脚本之前设置'PYTHONPATH =''。 –
abarnert
2014-11-05 00:00:11