2014-11-04 113 views
3

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

+1

嘗試:'(CD $ && SCRIPTDIR蟒蛇./devicelist.py $ @)' – ryanpattison 2014-11-04 23:55:50

+1

你的工作目錄必須是'outer_module'所在的目錄,而不是'outer_module'本身;否則'outer_module'不是一個包(因此是例外)。 (這很難做得太精確,因爲你似乎已經在問題的中途切換了所有的名字,但是如果你在'inner_module'裏面,那就是同樣的問題。) – abarnert 2014-11-04 23:59:15

+1

或者,您只需不要在這些目錄的_any_中,並在運行腳本之前設置'PYTHONPATH = ''。 – abarnert 2014-11-05 00:00:11

回答

2

您需要在PYTHONPATH環境變量中包含外部模塊父目錄的路徑,那麼您可以使用與第一個腳本中使用的命令相同的命令。

PYTHONPATH就是對於任何模塊蟒蛇搜索嘗試導入:

#!/bin/bash 
export PYTHONPATH=$PYTHONPATH:PATH/TO/MODULE/PARENTDIR 
python -m outer_module.inner_module.myscript [email protected] 
2

隨着錯誤消息指出:

ValueError: Attempted relative import in non-package 

對此的解決方案是創建一個包,並有您的腳本將在該路徑中執行該包。

您已經擁有一個包,因爲您在這些目錄中有__init__.py文件;但正如你所提到的那樣,當你從項目目錄中調用它時,你只能在你的路徑中找到這個包;這是因爲.默認在你的Python路徑中。

爲了解決這個問題,只需添加項目目錄,以你的Python路徑,然後用python -m outer_module.inner_module.myscript調用它:

#!/bin/bash 
export PYTHONPATH=$PYTHONPATH:$(dirname "$BASH_SOURCE")/../.. 
python -m outer_module.inner_module.myscript [email protected]