在Python / Spyder中设置工作目录,使其可复现

23

从 R 过来,使用 setwd 命令更改目录是不可取的,因为其他人没有与我相同的目录结构将无法重现。因此,建议使用相对路径。

在集成开发环境(IDE)中可能会稍微复杂一些,因为它们会设置自己的工作目录。在 Rstudio 中,我可以通过使用 Rstudio 项目解决这个问题,将项目的目录设置为我的脚本文件夹。

对于 Python 和 Spyder 来说,似乎没有解决方案。Spyder 没有像 Rstudio 项目一样的功能。在进行交互式分析时,将目录设置为脚本位置 是行不通的(因为没有 __file__ 变量可用)。

那么,在 Python/Spyder 中如何实现可重现的工作目录呢?


没有一个答案能像 R 库 "here" 一样有效。 - EngrStudent
一个不将默认目录关联到脚本目录,或者如果脚本尚未保存,则将其关联到用户目录的IDE,在2016年是相当奇怪的。可惜的是,Spyder在5年后仍然属于这个类别。在Python世界中,常数以km/h而不是Gm/s表示;-) - mins
6个回答

17

要自动执行此操作,请在脚本开头加入以下内容:

from os import chdir, getcwd
wd=getcwd()
chdir(wd)

2
这似乎不再起作用了。wd Out[4]: 'C:\\Users\\Admin',尽管我运行代码的.py文件在另一个目录中。通常,如果您使用F5运行脚本,则目录会被正确分配,请参见https://github.com/spyder-ide/spyder/issues/3154,参见@Hack-R的答案。 - questionto42

8

在此期间,您可以使用os.chdir

import os
os.chdir('C:\Users\me\Documents')

4

根据这个GitHub工单,Spyder团队似乎已经考虑将其作为一项功能,但截至五月中旬仍在等待实现:

我们可以在运行对话框中添加一个选项,自动将工作目录设置为正在运行脚本的目录。

然而,其他人需要来实现它。我们目前非常忙碌,抱歉。

https://github.com/spyder-ide/spyder/issues/3154

@ccordoba12 在5月14日将此添加到心愿单里


这个问题还没有解决。已经有不同的解决方案了。请看@AkashMantry的答案。 - questionto42

2

正如我在这里所写的那样,Mark8888 指出应该运行整个脚本(运行文件(F5)),而不仅仅是脚本的一部分。

这样,多种方法都可以用来获取脚本文件位置并更改当前工作目录。

import os
# directory of script file
print(os.path.abspath(os.path.dirname(__file__)))
# change current working directory
os.chdir(os.path.abspath(os.path.dirname(__file__)))
# current working directory
print(os.getcwd())

同时

import os
import sys
# directory of script file
print(os.path.abspath(os.path.dirname(sys.argv[0])))
# change current working directory
os.chdir(os.path.abspath(os.path.dirname(sys.argv[0])))
# current working directory
print(os.getcwd())

1

好的,有很多你可以尝试的事情! 1. 在工具栏中将目录更改为当前目录。 2. 在首选项>全局工作目录中将全局目录更改为当前目录。点击“当前文件目录”单选按钮。

希望能有所帮助!


1
有没有办法用代码自动完成这个操作? - PM0087

1
我试过了,它有效。
import os
abspath = os.path.abspath('') ## String which contains absolute path to the script file
os.chdir(abspath) ## Setting up working directory

这似乎不再起作用了。os.path.abspath('') Out[12]: 'C:\\Users\\Admin',尽管我运行代码的.py文件在另一个目录中。通常,如果您使用F5运行脚本,则会正确分配dir,请参见https://github.com/spyder-ide/spyder/issues/3154,参见@Hack-R的答案。 - questionto42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接