我有一個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