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

2024-11-20 08:44:00
admin
原创
7
摘要:问题描述:我的书上写道:计算机上运行的每个程序都有一个当前工作目录,即 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 的系统来说,它都是相同的。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用