3

我对 Python 中处理路径的方式有点困惑。使用常用构造行“~”或“.” 或“..”,我经常遇到路径不被识别为有效或不存在的情况,尤其是当我将路径作为参数传递给 shell 命令时;但是如果我总是做类似的事情,我所有的问题都会消失:

some_path = os.path.abspath(os.path.expanduser(some_path))

这是一个常见的——甚至可能是必需的——习语,还是我只是在重新发明轮子?我真的应该期望无论我拥有什么some_path,我都应该拥有上面的代码,然后再将其传递给任何(或至少大多数)对其执行任何操作的函数?

4

3 回答 3

2

是的,您可以调用的大多数东西都会期望经过该习语的路径。当您在 shell 中使用类似的路径时(例如,当您执行类似的操作时cat ~raxacoricofallapatorius/foo.txt),是shell 本身- 而不是cat您可能运行的任何其他程序 - 执行路径规范化。

您可以简单地验证这一点 - 例如,

lvc@tiamat:~/Projects$ echo ~
/home/lvc

所以这确实意味着,如果您希望获得以这些变量作为输入的路径,您将需要自己进行预处理。另一种方法是通过 shell 运行命令,并准备好处理带来的所有问题

但是,至少在类 unix 系统上(Windows 的行为方式可能相同,也可能不同),您不需要这样做- 系统调用可以理解这些,.并且..shell 不会转换它们 - 所以,例如:

lvc@tiamat:~/Projects$ file ..
..: directory
lvc@tiamat:~/Projects$ file ~
/home/lvc: directory

请注意file看到..不变,但看到 的扩展形式~

这意味着,如果您想要的只是可以直接在外部程序中工作的路径,那么通过它expanduser并且可能expandvars就足够了。如果您要调用abspath的程序将在与您的工作目录不同的工作目录中运行,您将主要需要调用。

于 2013-01-05T03:53:10.443 回答
1

是的,如果您需要一个已解析的绝对路径,则$HOME必须这样做。

如果您经常需要此功能,编写一个简短的辅助函数应该很容易。还有可用的路径助手库,如下所示:

于 2013-01-05T03:42:20.303 回答
-1

这通常是个好主意。os.path.abspath 将解析 .、.. 和 ~ 等相对路径。如果您希望您的代码可以跨操作系统移植,那么您应该使用 os.path 而不是定义自己的路径处理,如果可以的话 - os.path 始终指向您所在操作系统的正确路径模块。如果您尝试定义自己的路径函数,您将失去 os.path 的内置跨平台行为。

于 2013-01-05T03:48:35.953 回答