【问题标题】:How to catch a python ImportError as a Shell error如何将 python ImportError 捕获为 Shell 错误
【发布时间】:2015-09-20 03:59:26
【问题描述】:

我有一个检查是否安装了 python 模块的以下脚本。

{

ipython -c 'from package import module' && echo "Successful import"

} || echo "package not found!"

这是典型的try..catch bash 语法。如果 && 之前的命令有效,它将执行之后的命令,否则执行 || 之后的命令。

但是在这种情况下,package是否安装,或者我应该说是否命令

ipython -c 'from package import module'

返回NoneImportError,bash 将其读取为成功执行并打印“成功导入”

如何使用 bash 检查是否成功导入了 python 包?

编辑:并以退出状态 1 返回?

【问题讨论】:

    标签: python bash shell


    【解决方案1】:

    您可以对任何不是None0 的消息使用异常SystemExit(msg=None)。如果未被捕获,则会导致程序结束,如果msg 不是None0,则退出代码为1。 (见:https://docs.python.org/3/library/exceptions.html#SystemExit)。

    test.py

    try:
        import Blue
    except ImportError:
        raise SystemExit("Import Error!")
    

    在 bash 中:

    [user]@[host] $ python test.py 
    Import Error!
    
    [user]@[host] $ python test.py || echo "blarg"
    Import Error!
    blarg
    
    [user]@[host] $ python test.py && echo "blarg"
    Import Error!
    

    【讨论】:

    • 这有帮助。但它没有以状态 1 退出。我该怎么做?
    • python 进程可以。这就是为什么第一个 echo 被执行而第二个没有被执行的原因。
    • @HimanshuMishra 你用pythonipython 调用python 吗?
    • 是的。对不起。我用echo $?检查了它,它给了我1的状态。但是,我在 travis 上运行它,它以状态 0 退出。我用 python 运行它。
    【解决方案2】:

    使用python 命令以编程方式运行代码sn-ps,而不是ipython

    关于这个有一个突出的错误: https://github.com/ipython/ipython/issues/6912

    【讨论】:

      【解决方案3】:

      你至少有两种可能:

      • 在您的 shell 脚本中使用“pip”来获取已安装包的列表,然后使用 grep 获取游览包:

        点列表 | grep yourpackage && echo 已安装 || echo "未安装"

      • 使用 Python-bash 脚本,我不知道如何调用它,但我知道如何使用它:

      类似:

      output=$(
      python - <<EOF
      try:
          import your_package;
          print "Package Installed"
      except Exception:
          print "Package not installed"
      EOF
      )
      
      echo $output
      

      在这里,您有很多替代方法来检查包/模块的存在,因此,除了尝试导入包之外,您还可以以 Python 方式检查它的存在。您可以为此 answerthis 获取不同的解决方案,并将 import your_package; 替换为其中之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        • 2012-02-11
        • 2018-03-28
        • 2013-08-18
        • 2022-11-10
        相关资源
        最近更新 更多