Python 使os.path.expandvars像在shell中一样展开

Python 使os.path.expandvars像在shell中一样展开,python,shell,Python,Shell,我想像shell一样在中展开环境 这是我的代码: >os.path.expandvars(“$path”) “'/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site\u perl:/usr/bin/vendor\u perl:/usr/bin/core\u perl'” 在壳牌时: $echo'$PATH' $PATH 更新#1 更清楚地说,我不希望expandvars以单引号展开字符串

我想像shell一样在中展开环境

这是我的代码:

>os.path.expandvars(“$path”)
“'/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site\u perl:/usr/bin/vendor\u perl:/usr/bin/core\u perl'”
在壳牌时:

$echo'$PATH'
$PATH

更新#1
更清楚地说,我不希望
expandvars
以单引号展开字符串,因为shell不会展开它们

更新#2 我想实现这样的目标:

>>> os.path.expandvars("$USER '$USER'")
"rapiz $USER"
在壳牌的时候

$ echo '$PATH'
$PATH 
如果不使用引号,也有相同的输出,如

echo$PATH
此外,在python中,您可以使用

>os.path.expandvars(“$path”)
“/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site\u perl:/usr/bin/vendor\u perl:/usr/bin/core\u perl”
#或
>>>打印(os.path.expandvars(“$path”))
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site\u perl:/usr/bin/vendor\u perl:/usr/bin/core\u perl

另外,我觉得您对使用python交互式shell有点误解,因此我在下面添加了几行

导入操作系统 >>>my_envs=os.path.expandvars(“$path”) >>>我的环境看看这个输出 “/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site\u perl:/usr/bin/vendor\u perl:/usr/bin/core\u perl” >>>打印(my_envs)#并查看此输出 /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site\u perl:/usr/bin/vendor\u perl:/usr/bin/core\u perl 你看到输出的不同吗


更新#1 @拉皮兹写道:

更新#2 我想实现这样的目标:

>>> os.path.expandvars("$USER '$USER'")
"rapiz $USER"
>os.path.expandvars($USER'$USER'))
“rapiz$用户”
下面的解决方案如何

>user_env='$user'
>>>user_env_val=os.path.expandvars(user_env)
>>>打印(f'{user_env_val}{user_env}')
“rapiz$用户”

expandvars
故意扩展路径,引用python:

与unixshell不同,Python不进行任何自动路径扩展。当应用程序需要类似shell的路径扩展时,可以显式调用expanduser()和expandvars()等函数。(另请参见glob模块。)

如果要精确复制shell命令,可以使用
os.popen

import os

output = os.popen("echo '$PATH'").read()

尝试不使用引号
echo$PATH
。如果要使用引号,请使用双引号:
echo“$PATH”
。shell引号规则比您想象的更难与shell处理的其他部分分开。更清楚地说,我不希望
expandvars
expand strings in quotes.,关于“expand strings in quotes”,看一看。在从
expandvars
获取输出后,您不能加入字符串
'$USER'
吗?我想我理解了打印和返回值之间的区别。希望更新2能让问题更清楚。“rapiz,我添加并修复了更新#1您的
输出将是
'$PATH\n'
它可以工作。但我认为这还不够好,因为如果字符串来自用户的输入,就会导致漏洞。哪个字符串直接来自用户
“$USER”
?我认为这是我能找到的最好的解决方案。虽然它有一些缺点,但它简单有效。