当前工作目录到底是什么?

2024-11-20 08:44:00
admin
原创
41
摘要:问题描述:我的书上写道:计算机上运行的每个程序都有一个当前工作目录,即 cwd。任何不以根文件夹开头的文件名或路径都被视为位于当前工作目录下os.getcwd()由于我在 OSX 上,我的根文件夹是 /。当我在 Python shell 中输入时,我得到/Users/apple/Documents。为什么我的...

问题描述:

我的书上写道:

计算机上运行的每个程序都有一个当前工作目录,即 cwd。任何不以根文件夹开头的文件名或路径都被视为位于当前工作目录下

os.getcwd()由于我在 OSX 上,我的根文件夹是 /。当我在 Python shell 中输入时,我得到/Users/apple/Documents。为什么我的 cwd 中会出现 Documents 文件夹?是不是说 Python 正在使用 Documents 文件夹?没有任何以 (根文件夹) 开头的 Python 路径/?此外,每个程序都有不同的 cwd 吗?


解决方案 1:

每个进程都有一个当前目录。当进程启动时,它只是从其父进程继承当前目录;并且它不会被设置为包含您正在运行的程序的目录。

如需更详细的解释,请继续阅读。

当磁盘变得足够大以至于您不想将所有文件放在同一个位置时,操作系统供应商想出了一种在目录中组织文件的方法。因此,您不必将所有内容都保存在同一个目录(或现在初学者被教导称之为“文件夹”)中,而是可以在其中创建新集合和其他新集合(除了在某些早期实现中目录不能包含其他目录!)

从根本上来说,目录只是一种特殊类型的文件,其内容是其他文件的集合,也可以包括其他目录。

在原始操作系统上,故事就到此结束了。如果你想打印一个名为的文件,term_paper.txt该文件位于目录中spring_semester,而目录中2021又位于目录studiesmine,你必须说

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 类似),尽管您的终端可能可以配置为在其他地方打开(在一些表面上“现代”和“友好”的系统上,通常DesktopDocuments您的主目录中打开)。

许多初学者对于运行程序时会发生什么有一个模糊和不完整的心理模型。许多人会不停地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 的系统来说,它都是相同的。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用