从Bash文件运行Python脚本导致导入错误

7

我编写了一个简单的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"

编辑:看起来这是一个绝对路径/相对路径的问题,即Bash文件和Python文件的位置。由于Python文件使用相对路径,运行Bash文件使其不知道自定义模块的源在哪里。


3
运行Python3.4解释器和Bash脚本时,cwd是否不同? - khampson
1
which python3.4 命令是否返回 /usr/bin/python3.4 - chrisaycock
目录似乎是问题所在。导入函数使用的是相对路径,而不是完整路径。当我运行python3.4 game.py时,通常是从它所在的目录中运行的。 - Gramps
2
尝试在您的脚本中添加一个隐式的 cd /the/correct/directory - indivisible
@indivisible 非常好,完美解决了!谢谢。我会将其写入我的Bash和安装脚本中。 - Gramps
1个回答

3
如果您担心相对路径和绝对路径(听起来可能是潜在的原因),我建议您像我的代码一样做,以确保您在bash脚本中使用相对路径。基本上,您将cwd切换到包含游戏文件的目录,但利用pushd和popd确保切换不会影响其他任何内容。将重定向到/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

谢谢,这似乎也很有效。干杯! - Gramps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接