下面的代码将不会连接,在调试时,命令不存储整个路径,而只存储最后一个条目。

os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')

当我测试这个时,它只存储/new_sandbox/部分的代码。


当前回答

为了帮助理解为什么这种令人惊讶的行为并不完全可怕,考虑一个接受配置文件名作为参数的应用程序:

config_root = "/etc/myapp.conf/"
file_name = os.path.join(config_root, sys.argv[1])

如果应用程序以以下方式执行:

$ myapp foo.conf

将使用配置文件/etc/myapp.conf/foo.conf。

但是考虑一下如果应用程序被调用时会发生什么:

$ myapp /some/path/bar.conf

然后myapp应该使用/some/path/bar.conf的配置文件(而不是/etc/myapp.conf/some/path/bar.conf或类似文件)。

这可能不是很好,但我相信这是绝对路径行为的动机。

其他回答

os.path.join()的思想是让你的程序跨平台(linux/windows/etc)。

一刀就毁了它。

所以它只有在与某种参考点一起使用时才有意义 操作系统。environ['HOME']或os.path.dirname(__file__)。

后面的字符串不应该以斜杠开头。如果它们以斜杠开头,那么它们被认为是“绝对路径”,之前的所有内容都将被丢弃。

引用Python文档中的os.path.join:

如果一个组件是一个绝对路径,那么之前的所有组件都将被丢弃,连接将继续从绝对路径组件开始。

注意,在Windows上,与驱动器号相关的行为,与早期的Python版本相比,似乎已经发生了变化:

在Windows上,当遇到绝对路径组件(例如r'\foo')时,驱动器号不会重置。如果组件中包含驱动器号,则丢弃之前的所有组件并重置驱动器号。注意,由于每个驱动器都有一个当前目录,os.path。join("c:", "foo")表示相对于c盘(c:foo)上当前目录的路径,而不是c:\foo。

为了让你的函数更可移植,可以这样使用它:

os.path.join(os.sep, 'home', 'build', 'test', 'sandboxes', todaystr, 'new_sandbox')

or

os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox')

不要在路径组件的开头使用正斜杠,除非指向根目录:

os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')

参见:http://docs.python.org/library/os.path.html#os.path.join

Os.path.join()可以与os.path.sep一起使用来创建一个绝对路径,而不是相对路径。

os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox')