获取调用python脚本的bash脚本的位置

时间:2018-09-28 13:54:07

标签: python bash path

我找不到解决问题的方法,我希望这不是重复的,希望有人可以帮助我。

我有一个bash脚本可以调用的python脚本,但是我无法检索bash脚本的目录。

我不能使用os.getcwd(因为我不会从其自己的目录中调用bash脚本)。

我无法在bash脚本中设置自定义环境变量,因为我无法控制bash脚本(实际上有2个bash脚本,而我只能控制一个)

此外,bash脚本可以由另一个bash脚本启动,但我只希望最后一个调用我的python脚本。

谢谢

编辑:总结的问题:

->我想在我的python脚本中检索“调用我”的bash脚本的目录

2 个答案:

答案 0 :(得分:2)

我认为从python脚本内部不可能实现。它必须由bash脚本直接或间接调用来驱动。

您可以使用问题@Benjamin在注释中发布的方式,在bash脚本本身中找到bash脚本的路径,然后将其作为参数传递给python脚本,或设置env变量。

我知道您不想这样做。但是诸如psutil之类的其他方法也将取决于父脚本的运行方式。如果您可以确保可以使用父脚本的绝对路径而不是调用脚本的方式来运行父脚本,那么@SocketPlayer对此问题的回答将非常适合您。我的Macbook上有以下作品

import psutil

calling_script = psutil.Process().parent()

print ("calling_script", calling_script.cmdline()[1])

在python脚本中:(将其作为cmd参数传递的示例)

import argparse


if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument(
        'callers_path', help="the shell script calling this python script must provide it's path here", type=str)
    args = parser.parse_args()
    callers_path = args.callers_path
    print ("callers_path", callers_path)

答案 1 :(得分:1)

您可以通过获取运行python脚本的父进程来做到这一点。

为此尝试使用psutilenter image description here

更新: 所以这是更具体的解决方案: 首先获得上面显示的父进程。

现在有两个选择:

  1. 批处理文件以绝对路径运行。
  2. 批处理文件以相对路径运行。

如果是绝对路径,则应使用cmdline的输出 一切都会很棒。

如果是相对路径,请从cmdline获取相对路径, 并将其与绝对路径的cwd输出结合。

示例:

enter image description here