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

标签 python linux bash shell

我有一个 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/

相关文章:

Linux shell 脚本查找和重命名文件以删除后缀?

bash - 提取匹配 "foo"的文件的最后 10 行

python - 属性错误: 'slice' object has no attribute 'flags' Error

python - 如何让x轴标签适合图表的宽度?

linux - 在 Unix 中搜索和打印

c# - 如何在 JetBrains Rider 中添加/使用 C# 库?

linux-bash 从 csv 中读取数据并有条件地求和值

python - 仅使用 1 个 web dyno 和 0 个 worker dyno 运行 Heroku 后台任务

python - Mongolab 拒绝连接

linux - 在 Linux 中搜索包含关键字的文件或文件夹