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

2024-05-16 00:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我的代码:

>>> os.path.expandvars("'$PATH'")
"'/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl'"

在壳牌时:

$ echo '$PATH'
$PATH

更新#1

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

更新#2

我想实现这样的目标:

>>> os.path.expandvars("$USER '$USER'")
"rapiz $USER"

Tags: path代码bin环境oslibusrlocal
2条回答

expandvars故意扩展路径,引用pythondocs

Unlike a unix shell, Python does not do any automatic path expansions. Functions such as expanduser() and expandvars() can be invoked explicitly when an application desires shell-like path expansion. (See also the glob module.)

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

import os

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

While in shell,

$ 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_perl:/usr/bin/vendor_perl:/usr/bin/core_perl'

# or

>>> print(os.path.expandvars('$PATH'))
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

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

>>> import os
>>> my_envs = os.path.expandvars('$PATH')
>>> my_envs # Look at this output
'/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl'
>>> print(my_envs) # And look at this output
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

你看到输出的不同吗


更新#1

@rapiz写道:

UPDATE #2

I want to achieve something like this:

>>> os.path.expandvars("$USER '$USER'")
"rapiz $USER"

下面的解决方案如何

>>> user_env = '$USER'
>>> user_env_val = os.path.expandvars(user_env)
>>> print(f'"{user_env_val} {user_env}"')
"rapiz $USER"

相关问题 更多 >