gpt4 book ai didi

python - os.system 与命令行有何不同?

转载 作者:行者123 更新时间:2023-12-05 02:18:23 25 4
gpt4 key购买 nike

为什么我的 python 解释器的 os.system('command') 与终端的命令输出不同?

快速解释问题:

我有

echo $CONFPATH
/home/claramart/Datamart/Parameter

但是

os.system('echo $CONFPATH')

0

这是为什么?

详细信息:我想获得我的环境 $CONFPATH。我正在使用 python3.5 和 ubuntu16.04.2。

我可以从命令行执行此操作:

echo $CONFPATH
/home/claramart/Datamart/Parameter

这就是我想要的答案。

从命令行将其作为 python 命令执行也可以:

python3 -c 'import os; print(os.environ["CONFPATH"])'
/home/claramart/Datamart/Parameter

问题是,我想从我的 python 解释器而不是命令行执行它。从我的 python 解释器执行它不起作用(我使用的是 Pyzo4.4.1):

print(os.environ["CONFPATH"])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python3.5/os.py", line 725, in __getitem__
raise KeyError(key) from None
KeyError: 'CONFPATH'

我想这完全来 self 的解释器,而不是 python 本身,因为从命令行执行的 python 有效。此外,我可以从我的 python 解释器中获取 $PYTHONPATH,所以我猜它只是没有检测到所有环境变量。

为了避免这种情况并且因为从命令行执行它有效,我想从我的 python 解释器作为命令行执行来执行此操作,但是我的 2 个命令行执行都没有按照我想要的方式工作:

os.system('echo $CONFPATH')

0

和:

os.system("""python3 -c 'import os; print(os.environ["CONFPATH"]'""")
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.5/os.py", line 725, in __getitem__
raise KeyError(key) from None
KeyError: 'CONFPATH'
256

再一次,在这两种情况下,它都适用于 $PYTHONPATH,所以我想它必须在某个时候通过我的解释器,因为我的问题特定于变量 $CONFPATH。

为什么我的 python 解释器的 os.system('command') 与终端的命令输出不同?

最佳答案

我认为您期望只有一种环境。事实上,每个进程都有自己的环境,通常是从其父进程继承的。不幸的是,我在你的代码片段中没有看到足够的信息来告诉你如何传递这个特定的值,但我们可以通过它们并查看它们实际说的是什么。

echo $CONFPATH
/home/claramart/Datamart/Parameter

这显示了一个 shell 命令 echo演示 shell 可以扩展参数 $CONFPATH .但是,它不显示它是来自 shell 还是环境变量。不过,后面的片段确实表明您确实拥有一个设置它的环境。

os.system('echo $CONFPATH')

0

这是一个 Python 函数调用,依次调用 C 库函数,这会导致生成一个新的 shell 并解释给定的命令。值得注意的是,这与您运行的任何 shell 都不一样;它是一个新的/bin/sh 进程,它从进行调用的 Python 解释器继承环境。我们看到这个 shell 命令成功(退出值 0)并将 CONFPATH 扩展为空,表明它是空的或未设置Python 解释器的环境。

python3 -c 'import os; print(os.environ["CONFPATH"])'
/home/claramart/Datamart/Parameter

这是一个启动 Python 解释器的 shell 命令示例,其中的命令行导致它打印环境变量。它成功了,因为该变量是从您运行命令的 shell 继承的。

os.system("""python3 -c 'import os; print(os.environ["CONFPATH"]'""")
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.5/os.py", line 725, in __getitem__
raise KeyError(key) from None
KeyError: 'CONFPATH'
256

这里一个包裹着另一个;从一个 Python 解释器,一个 shell 开始运行一个命令,该命令启动另一个 Python 解释器,该解释器应该打印 CONFPATH 环境变量。但是,此内部 Python 代码失败,在其环境中未找到 CONFPATH 时引发 KeyError 异常。这与 shell 的行为形成对比,shell 的行为只是显示一个空值。由于未捕获到异常,因此打印了一个回溯,Python shell 返回了一个错误代码,该错误代码又由子 shell 返回,最后由我们的外部 Python 解释器打印为 256。

您展示了从两个不同环境运行的命令:设置了 CONFPATH 的 shell 和未设置的 Python 解释器。 pstree , ps fps -H可能会帮助您可视化进程树,从而了解环境是从哪里继承的。请注意,环境是从父进程复制的;在 parent 中改变它只会影响新的 child ,而不是现有的 child 。

在 Linux 中,也可以在/proc 文件系统中找到环境。例如,tr \\0 \\n < /proc/$$/environ打印运行它的 shell 的环境(shell 将 $$ 扩展为它自己的进程 ID)。

当您从不同的环境运行事物时,这种区别变得更加重要;例如,通过您的 .profile 设置的任何内容或 .bashrc文件不会影响从 cron 运行的命令,与系统启动脚本类似。大多数程序按原样保留环境,但有些程序会出现特定的异常(exception)情况,例如 setuid 程序忽略 LD_LIBRARY_PATH,或 suenv重写环境。

关于python - os.system 与命令行有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45346999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com