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

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

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


当前回答

问题是你的笔记本电脑可能运行windows。Window烦人地使用后斜杠而不是前斜杠'/'。让你的程序跨平台(linux/windows/etc)。 如果想要os.path.join正确地处理它们,就不应该在路径中提供任何斜杠(向前或向后)。你应该使用:

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

或者抛出一些Path(__file__).resolve()。Parent(当前文件的父路径)或任何东西,这样你就不会在os.path.join中使用任何斜杠

其他回答

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

一刀就毁了它。

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

只使用new_sandbox试试

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

问题是你的笔记本电脑可能运行windows。Window烦人地使用后斜杠而不是前斜杠'/'。让你的程序跨平台(linux/windows/etc)。 如果想要os.path.join正确地处理它们,就不应该在路径中提供任何斜杠(向前或向后)。你应该使用:

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

或者抛出一些Path(__file__).resolve()。Parent(当前文件的父路径)或任何东西,这样你就不会在os.path.join中使用任何斜杠

这是因为'/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或类似文件)。

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