我有一个 Python 脚本,比如 myscript.py
,它使用相对模块导入,即 from .. import module1
,我的项目布局如下:
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 $@
这可以执行 myscript.py
并根据需要将参数转发到我的脚本,但它仅在我调用 ./outer_module/inner_module/myscript.sh
时有效从上面显示的 project
目录中。
我怎样才能让这个脚本在任何地方都能运行?例如,我如何才能使它适用于像 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 $@
当我如上所示执行 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
。
最佳答案
如错误信息所述:
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 $@
关于python - 如何运行从任何位置调用 Python 脚本的 Bash 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26747308/