我有一个Python脚本,例如myscript.py,它使用相对的模块导入,即从.. 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时,此方法才有效.
如何使该脚本在任何地方都能工作?例如,如何使此工作适用于bash /root/to/my/project/outer_module/inner_module/myscript.sh这样的调用?
这是我的尝试:
从其他任何地方执行myscript.sh时,都会出现错误:没有名为external_module.inner_module的模块.然后,我尝试了另一种方法,可以通过将myscript.sh替换为在任何地方执行bash脚本的方法:
#!/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第一行中的相对导入而来的,该相对导入来自.. import module1.
解决方法:
您需要在PYTHONPATH环境变量中包括外部模块的父目录的路径,然后可以在任何地方使用在第一个脚本中使用的相同命令.
PYTHONPATH是python搜索您尝试导入的任何模块的位置:
#!/bin/bash
export PYTHONPATH=$PYTHONPATH:PATH/TO/MODULE/PARENTDIR
python -m outer_module.inner_module.myscript $@
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。