为什么os.path.join()在这种情况下工作?
下面的代码将不会join,debugging时该命令不会存储整个path,而只是最后一个条目。
os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')  当我testing它时,它只存储/new_sandbox/部分代码。 
后面的string不应该以斜线开头。 如果他们以斜线开始,那么他们就被认为是“绝对path”,而他们面前的一切都被抛弃了。
 引用os.path.join的Python文档 : 
如果某个组件是绝对path,则以前的所有组件都将被丢弃,并从绝对path组件继续连接。
在Windows上注意,与驱动器号相关的行为,与早期的Python版本相比似乎已经发生了变化:
在Windows上,当遇到绝对path组件(例如
r'\foo')时,驱动器号不会被重置。 如果某个组件包含驱动器号,则以前的所有组件都将被丢弃,并重置驱动器号。 请注意,由于每个驱动器都有当前目录,因此os.path.join("c:", "foo")表示相对于驱动器C:上当前目录的pathC:(c:foo),而不是c:\foo。
  os.path.join()的思想是让你的程序跨平台(linux / windows / etc)。 
即使是一个斜线也会毁掉它。
 因此,只有在使用os.environ['HOME']或os.path.dirname(__file__)等参考点os.path.dirname(__file__) 。 
  os.path.join()可以和os.path.sep结合使用来创build绝对path而不是相对path。 
 os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox') 
除了引用根目录以外,不要在path组件的开始处使用正斜杠:
 os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox') 
另见: http : //docs.python.org/library/os.path.html#os.path.join
 这是因为你的'/new_sandbox/'以'/new_sandbox/'开始,因此被认为是相对于根目录的。 删除前导/ 。 
为了帮助理解为什么这个令人惊讶的行为不是完全可怕的,考虑接受configuration文件名作为参数的应用程序:
 config_root = "/etc/myapp.conf/" file_name = os.path.join(config_root, sys.argv[1]) 
如果应用程序执行的是:
 $ myapp foo.conf 
 将使用configuration文件/etc/myapp.conf/foo.conf 。 
但是考虑一下如果用下面的方法调用应用程序会发生什么:
 $ myapp /some/path/bar.conf 
 然后myapp 应该使用/some/path/bar.conf (而不是/etc/myapp.conf/some/path/bar.conf或类似的)的configuration文件。 
这可能不是很好,但我相信这是绝对path行为的动机。
为了使你的function更加便携,可以这样使用它:
 os.path.join(os.sep, 'home', 'build', 'test', 'sandboxes', todaystr, 'new_sandbox') 
要么
 os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox') 
 只用new_sandbox试试 
 os.path.join('/home/build/test/sandboxes/', todaystr, 'new_sandbox') 
这样做,不要太多额外的斜杠
 root="/home" os.path.join(root,"build","test","sandboxes",todaystr,"new_sandbox") 
 请注意,如果使用os.path.join()来包含一个已经包含一个点的扩展(这是在使用os.path.splitext()时会自动发生的事情os.path.join() ,则类似的问题会引起您的注意。 在这个例子中: 
 components = os.path.splitext(filename) prefix = components[0] extension = components[1] return os.path.join("avatars", instance.username, prefix, extension) 
 即使extension可能是.jpg你最终会得到一个名为“foobar”的文件夹,而不是一个名为“foobar.jpg”的文件。 为了防止这种情况,您需要单独附加扩展名: 
 return os.path.join("avatars", instance.username, prefix) + extension