当前工作目录到底是什么?
- 2024-11-20 08:44:00
- admin 原创
- 7
问题描述:
我的书上写道:
计算机上运行的每个程序都有一个当前工作目录,即 cwd。任何不以根文件夹开头的文件名或路径都被视为位于当前工作目录下
os.getcwd()
由于我在 OSX 上,我的根文件夹是 /。当我在 Python shell 中输入时,我得到/Users/apple/Documents
。为什么我的 cwd 中会出现 Documents 文件夹?是不是说 Python 正在使用 Documents 文件夹?没有任何以 (根文件夹) 开头的 Python 路径/
?此外,每个程序都有不同的 cwd 吗?
解决方案 1:
每个进程都有一个当前目录。当进程启动时,它只是从其父进程继承当前目录;并且它不会被设置为包含您正在运行的程序的目录。
如需更详细的解释,请继续阅读。
当磁盘变得足够大以至于您不想将所有文件放在同一个位置时,操作系统供应商想出了一种在目录中组织文件的方法。因此,您不必将所有内容都保存在同一个目录(或现在初学者被教导称之为“文件夹”)中,而是可以在其中创建新集合和其他新集合(除了在某些早期实现中目录不能包含其他目录!)
从根本上来说,目录只是一种特殊类型的文件,其内容是其他文件的集合,也可以包括其他目录。
在原始操作系统上,故事就到此结束了。如果你想打印一个名为的文件,term_paper.txt
该文件位于目录中spring_semester
,而目录中2021
又位于目录studies
中mine
,你必须说
print mine/studies/2021/spring_semester/term_paper.txt
(除了命令可能比更神秘print
,并且目录分隔符可能是一些疯狂的东西,如方括号和冒号,或类似的东西;
lpr [mine:studies:2021:spring_semester]term_paper.txt
但这对于本次说明并不重要),如果您想复制该文件,则必须将整个 enchilada 拼写两次:
copy mine/studies/2021/spring_semester/term_paper.txt mine/studies/2021/spring_semester/term_paper.backup
然后出现了当前工作目录的概念。如果你可以说“从现在开始,除非我另有说明,我谈论的所有文件都将位于这个特定目录中”。这样命令就cd
诞生了(除了在 VMS 等旧系统上,它被称为更笨重的名字,例如SET DEFAULT
)。
cd mine/studies/2021/spring_semester
print term_paper.txt
copy term_paper.txt term_paper.backup
这就是全部了。当您cd
(或者,在 Python 中os.chdir()
)更改当前工作目录时。它会一直保留,直到您注销(或以其他方式退出此进程),或者直到您cd
转到不同的工作目录,或者切换到不同的进程或窗口,在该进程或窗口中运行具有其自己的当前工作目录的单独命令。就像您可以打开文件浏览器(Explorer 或 Finder 或 Nautilus 或任何名称)并在不同目录中打开多个窗口一样,您可以打开多个终端,每个终端都运行一个具有其自己独立的当前工作目录的 shell。
因此,当您pwd
在终端中键入内容(或cwd
命令语言中命令的名称)时,结果将在很大程度上取决于您之前在该窗口或进程中执行的操作,并且可能取决于您如何创建该窗口或进程。在许多类 Unix 系统中,当您创建具有关联 shell 进程的新终端窗口时,它最初会在您的主目录中打开(/home/you
在许多 Unix 系统上,/Users/you
在 Mac 上,或多或少C:Usersyou
与最近的 Windows 类似),尽管您的终端可能可以配置为在其他地方打开(在一些表面上“现代”和“友好”的系统上,通常Desktop
在Documents
您的主目录中打开)。
许多初学者对于运行程序时会发生什么有一个模糊和不完整的心理模型。许多人会不停地cd
进入包含他们的脚本或程序的目录,当你告诉他们你不必这样做时,他们会感到害怕和困惑。如果frobozz
你在里面/home/you/bin
,那么你不必
cd /home/you/bin
./frobozz
因为你可以直接运行它
/home/you/bin/frobozz
同样,如果你ls
也/bin
肯定不会
cd /bin
./ls
只是为了获得目录列表。
此外,像ls
(或在 Windows 上dir
)示例应该很容易说服您,您运行的任何程序都会在当前目录中查找文件。而不是保存程序或脚本的目录。因为如果是这种情况,ls
只能生成它所在目录的列表(/bin
)——目录列表程序、复制程序或文字处理程序没有什么特别之处;它们都按照设计在当前工作目录中查找(不过,一些 GUI 程序会按照设计将您的目录作为其当前工作目录启动Documents
,至少如果您没有告诉它们的话)。
许多初学者编写的脚本要求输入和输出文件位于特定用户主目录内的特定目录中,但这只是糟糕的设计;编写良好的程序将简单地在当前工作目录中查找其输入文件,除非另有指示,并将输出写入当前目录(或者如果输出包含多个文件,则可能在当前目录中为其输出创建一个新目录)。
那么,Python 与其他程序并没有什么不同。如果/Users/you/Documents
您运行时的当前工作目录是您的当前工作目录python
,那么该目录就是os.getcwd()
您的 Python 脚本或解释器内部将生成的内容(除非您os.chdir()
在运行时单独转到不同的目录;但同样,这可能是不必要的,并且通常表明脚本是由初学者编写的)。如果您的 Python 脚本接受文件名参数,它可能应该只是让操作系统获取open
用户传入的任何内容,这意味着相对文件名是相对于调用用户的当前工作目录的。
python /home/you/bin/script.py file.txt
如果当前目录中不存在,则应该简单地open(sys.argv[1])
失败并显示错误。让我们再说一遍;它不会查找——除非那当然也是您(调用用户)的当前工作目录,在这种情况下,您当然可以简单地编写file.txt
`/home/you/bin`file.txt
python script.py file.txt
与此相关的是,许多初学者不必要地尝试类似
with open(os.path.join(os.getcwd(), "input.txt")) as data:
...
这会不必要地调用os.getcwd()
。为什么它是不必要的?如果你一直在关注,那么你已经知道答案了:操作系统input.txt
无论如何都会在当前工作目录中查找相对文件名(如这里 )。所以你只需要
with open("input.txt") as data:
...
最后再说一句。在类 Unix 系统中,所有文件最终都在/
包含许多其他目录的根目录中(通常普通用户不允许在那里写入任何内容,而有权执行此操作的系统管理员通常不想这样做)。通过跟踪从根目录到当前目录的路径,每个相对文件名都可转换为绝对文件名。因此,如果我们要访问的文件在 中,则/home/you/Documents/file.txt
意味着home
在根目录中,并且包含you
,其中包含Documents
,其中包含file.txt
。如果您当前的工作目录为 ,则/home
您可以通过相对路径引用同一个文件you/Documents/file.txt
;如果您当前的目录为/home/you
,则它的相对路径为Documents/file.txt
(如果您当前的目录为 ,/home/you/Music
您可以说 ,../Documents/file.txt
但现在我们不再进一步讨论这个例子)。
Windows 的安排略有不同,它有多个带有单字母标识符的驱动器,每个驱动器都有自己的根目录;因此 C:驱动器的根目录是,C:
D:驱动器的根目录是D:
等等(目录分隔符是反斜杠而不是斜杠,尽管您几乎可以在任何地方使用斜杠,这通常是保持理智的好主意)。
解决方案 2:
您的 Python 解释器位置取决于您如何启动它,以及启动后采取的后续操作,例如使用 os 模块导航文件系统。仅启动解释器将把您置于 Python 安装的目录中(不同操作系统上的目录不同)。另一方面,如果您从编辑或运行特定目录中的文件开始,您的位置将是您正在编辑的文件的文件夹。如果您需要在某个目录中运行解释器,并且您正在使用空闲模式,最简单的方法是先在那里创建一个 Python 文件,然后在编辑它时,您可以使用 Run > Python Shell 启动一个 shell,该 shell 已经位于该目录中。如果您使用命令行解释器,请在运行 python/python3/py 命令之前导航到要运行解释器的文件夹。如果您需要手动导航,当然可以使用已经提到的以下内容:
import os
os.chdir('full_path_to_your_directory')
解决方案 3:
这与 osx 没有任何关系,它更像是所有基于 unix 的系统共享的概念,我相信 Windows 也是如此。os.getcwd()
相当于 bashpwd
命令 - 它只是返回您所在当前位置的完整路径。换句话说:
alex@suse:~> cd /
alex@suse:/> python
Python 2.7.12 (default, Jul 01 2016, 15:34:22) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/'
这取决于您从哪里启动 python shell/脚本。
解决方案 4:
通常情况下(除非您使用虚拟环境)可以从任何目录访问 Python。您可以检查路径中的变量,Python 应该可用。因此,当您询问 Python 时获得的目录就是您启动 Python 的目录。在启动 Python 之前,在 shell 中更改目录,您将看到您获得的输出将相应地发生变化。
解决方案 5:
os.getcwd()
与 OSX 无关。它只是返回源文件的目录/位置。如果我的源文件在我的桌面上,它会返回C:UsersDaveDesktop
,或者假设源文件保存在外部存储设备上,它可能会返回类似 的内容G:Programs
。对于基于 unix 和 Windows 的系统来说,它都是相同的。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件