2013-01-05 87 views
3

我在Python中处理路径的方式有些困惑。使用常见的结构行“〜”或“。”或“..”,我经常会遇到路径无法识别为有效或现有的情况,特别是如果我将路径作为参数传递给shell命令;但我的问题都消失,如果我总是做这样的事情:确保Python中可靠路径的最佳方法是什么?

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

这是一个共同的 - 或者甚至需要 - 成语,还是我只是重新发明轮子?我应该真的期望,无论我在哪里,只要有some_path,我都应该有上面的代码,然后才能将它传递给任何(或至少大部分)使用它的任何函数?

回答

2

是的,你可以调用的大多数东西都会指望已经穿过那个习语的路径。当你在shell中使用类似的路径时(例如,当你做类似cat ~raxacoricofallapatorius/foo.txt的事情时),它是shell本身 - 而不是cat或你可能运行的任何其他程序 - 它执行路径规范化。

您可以验证这个平凡 - 例如,

[email protected]:~/Projects$ echo ~ 
/home/lvc 

那么这是否意味着,如果你希望得到这些类型的变量作为输入的路径,你需要做预处理自己。另一种方法是通过shell运行这些命令,并准备好处理带来的所有问题

但是,至少在类Unix系统(Windows可能会或可能不会行为相同的方式),你需要为...做到这一点 - 这是由系统调用的理解,以及shell不会改变他们 - 所以,如:

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

这意味着如果你想要的只是直接在外部程序中工作的路径,那么通过expanduser和可能的expandvars就足够了。如果您要呼叫的程序将运行在与您的目录不同的工作目录中,您将需要拨打abspath

+0

首先调用哪个函数 - “expandvars”还是'expanduser'? – orome

-1

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

相关问题