2014-07-13 296 views
2

我寫了一個簡單的bash腳本來運行我在Python中製作的遊戲。但是,當我這樣做時,它會在嘗試導入自定義模塊時給我一個導入錯誤。從Bash文件運行Python腳本會導致導入錯誤

Traceback (most recent call last): 
    File "/home/user/Projects/Test/game.py", line 7, in <module> 
    import boot, splash, menu, game, player, options 
ImportError: No module named 'boot' 

我檢查了包含這些模塊的文件夾的權限並且它們是可訪問的。如果我只是在終端中運行game.py,如下所示:

python3.4 game.py 

然後,一切正常。沒有導入錯誤或任何東西。就在我將它作爲Bash文件運行時。作爲參考,這裏是我使用Bash的文件:

#!/bin/bash 
STRING="Launching game..." 
PYTHON="/usr/bin/python3.4" 
GAME="/home/user/Projects/Test/game.py" 
echo $STRING 
$PYTHON "$GAME" 

編輯:這似乎是一個絕對/相對路徑問題,因爲到猛砸文件和Python的文件。運行Bash文件,因爲Python文件使用相對路徑,所以它不知道自定義模塊的來源。

+3

當你運行python3.4解釋器和bash腳本時,* cwd *是不同的嗎? – khampson

+1

'哪個python3.4'給你'/ usr/bin/python3.4'? – chrisaycock

+0

該目錄似乎是問題所在。導入功能使用相對目錄,而不是完整路徑。當我運行python3.4 game.py時,我通常從它所在的目錄中執行它。 – Gramps

回答

2

如果您擔心相對絕對路徑(這不聽起來像他們可能是這裏的潛在原因),我會建議做一些像我下面的代碼,以確保您使用相對路徑在bash腳本中也有。

本質上講,你切換CWD包含遊戲文件的目錄,但槓桿PUSHDPOPD以確保開關不會影響任何東西。重定向到/dev/null是爲了抑制來自pushd/popd的輸出,這通常是腳本情況下的額外噪聲。

#!/bin/bash 
STRING="Launching game..." 
PYTHON="/usr/bin/python3.4" 
GAME_ROOT="/home/user/Projects/Test" 
GAME="game.py" 

pushd . > /dev/null 2>&1 
cd $GAME_ROOT 

echo $STRING 
$PYTHON "$GAME" 

popd > /dev/null 2>&1 
+0

謝謝,這也似乎工作得很好。乾杯! – Gramps

+0

當然,沒問題。 – khampson