微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何运行从任意位置调用Python脚本的Bash脚本?

我有一个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 举报,一经查实,本站将立刻删除。

相关推荐