Python 如何检查是从终端调用脚本还是从其他脚本调用脚本

Python 如何检查是从终端调用脚本还是从其他脚本调用脚本,python,linux,bash,ubuntu,Python,Linux,Bash,Ubuntu,我正在编写一个python脚本,仅当python脚本直接从终端运行而不是从任何其他脚本运行时,我才想执行一些代码 如何在Ubuntu中做到这一点而不使用任何额外的命令行参数 这里的答案不起作用: 这是我的目录结构 家 |-testpython.py |-script.sh script.py包含 当我运行./script.sh时,我希望发生一件事。 当我直接从终端运行./testpython.py而不调用script.sh时,我希望发生其他事情 我如何在通话方式中发现这种差异。获取父进程名

我正在编写一个python脚本,仅当python脚本直接从终端运行而不是从任何其他脚本运行时,我才想执行一些代码

如何在Ubuntu中做到这一点而不使用任何额外的命令行参数

这里的答案不起作用:

这是我的目录结构

家 |-testpython.py |-script.sh

script.py包含 当我运行./script.sh时,我希望发生一件事。 当我直接从终端运行./testpython.py而不调用script.sh时,我希望发生其他事情


我如何在通话方式中发现这种差异。获取父进程名称总是返回bash本身。

您可能应该改用命令行参数,但这是可行的。只需检查当前流程是否为流程组长:

$ sh -c 'echo shell $$; python3 -c "import os; print(os.getpid.__name__, os.getpid()); print(os.getpgid.__name__, os.getpgid(0)); print(os.getsid.__name__, os.getsid(0))"'
shell 17873
getpid 17874
getpgid 17873
getsid 17122
在这里,sh是流程组长,python3是该组中的一个流程,因为它是从sh派生出来的


请注意,管道中的所有进程都在同一个进程组中,最左边的进程是前导进程。

您可能应该改用命令行参数,但这是可行的。只需检查当前流程是否为流程组长:

$ sh -c 'echo shell $$; python3 -c "import os; print(os.getpid.__name__, os.getpid()); print(os.getpgid.__name__, os.getpgid(0)); print(os.getsid.__name__, os.getsid(0))"'
shell 17873
getpid 17874
getpgid 17873
getsid 17122
在这里,sh是流程组长,python3是该组中的一个流程,因为它是从sh派生出来的


请注意,管道中的所有进程都在同一个进程组中,最左边的是前导进程。

我建议使用命令行参数

script.sh

./testpython.py-来自脚本 testpython.py


我建议使用命令行参数

script.sh

./testpython.py-来自脚本 testpython.py


回答得好,但对我来说有点太复杂了。回答得好,但对我来说有点太复杂了。我不想要命令行参数的方式,因为我不知道以后什么脚本会调用python文件,使用命令行参数将是一种更干净、更容易调试的方式。调试python脚本的行为并发现当用户直接从脚本运行时,其行为会发生变化,这会让我感到沮丧。无论调用方法如何,让程序以相同的方式运行都是非常有价值的。我不想要命令行参数方式,因为我不知道以后哪些脚本将调用python文件,使用命令行参数将是一种更干净、更容易调试的方式。调试python脚本的行为并发现当用户直接从脚本运行时,其行为会发生变化,这会让我感到沮丧。不管调用方法如何,让程序以相同的方式运行是非常有价值的。
import sys
if "--from-script" in sys.argv:
    # From script
else:
    # Not from script