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

2024-01-11

我的书上说:

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

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


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

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

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

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

在原始操作系统上,故事就到此结束了。如果你想打印一个名为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到不同的工作目录,或者切换到不同的进程或窗口,在其中运行单独的命令its自己的当前工作目录。就像您可以在不同目录中使用多个窗口打开文件浏览器(Explorer 或 Finder 或 Nautilus 或其他任何名称)一样,您可以打开多个终端,并且每个终端都运行一个具有自己独立的当前工作目录的 shell。

所以当你输入pwd进入终端(或cwd或者无论命令在您的命令语言中被调用),结果很大程度上取决于您之前在该窗口或进程中执行的操作,并且可能取决于您如何创建该窗口或进程。在许多类 Unix 系统上,当您创建带有关联 shell 进程的新终端窗口时,它最初是在您的主目录中打开的(/home/you在许多 Unix 系统上,/Users/you在 Mac 上,或多或少类似于C:\Users\you在最近的 Windows 上)尽管您的终端可能可以配置为在其他地方打开(通常Desktop or Documents在一些表面上“现代”和“友好”的系统上的主目录中)。

许多初学者对于运行程序时发生的情况有一个模糊且不完整的心理模型。很多人都会不断cd进入包含他们的脚本或程序的目录,当你告诉他们你不必这样做时,你会感到真正的害怕和困惑。如果frobozz is in /home/you/bin那么你不必

cd /home/you/bin
./frobozz

因为你可以直接运行它

/home/you/bin/frobozz

类似地如果ls is in /bin你绝对不会

cd /bin
./ls

只是为了获取目录列表。

此外,像ls(或者在 Windows 上,dir)示例应该很容易说服您,您运行的任何程序都会查找your文件的当前目录。不是保存程序或脚本的目录。因为如果是这样的话,ls只能生成其所在目录的列表(/bin) -- 目录列表程序、复制程序或文字处理程序没有什么特别之处;根据设计,它们都在当前工作目录中查找(尽管有些 GUI 程序会再次查看)start例如你的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 for 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:\等等(目录分隔符是反斜杠而不是斜杠,尽管您几乎可以在任何地方使用斜杠,这通常是保持理智的好主意)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当前工作目录到底是什么? 的相关文章

  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • Pandas Merge (pd.merge) 如何设置索引和连接

    我有两个 pandas 数据框 dfLeft 和 dfRight 以日期作为索引 dfLeft cusip factorL date 2012 01 03 XXXX 4 5 2012 01 03 YYYY 6 2 2012 01 04 XX
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 如何检测我的 Android 设备何时与配对的蓝牙设备连接/断开连接

    我希望收到一个事件来检测蓝牙在我的设备中配对或取消配对的时间 一开始我发现http developer android com reference android bluetooth BluetoothServerSocket html h
  • Windows 上 Python 3.6 中的原始套接字数据包嗅探器

    我正在尝试嗅探数据包 但我得到了奇怪的输出 我不明白原因 这就是我的代码please help me 我在 Windows 8 1 上使用 Python 3 6 Code import socket import struct import
  • 获取 codeigniter 中的列值数组[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个具有以下结构的表 整数 ID 11 用户 ID int 11 notification event id int 11 我如何获得
  • linq 中的 switch 语句

    我使用 linq 进行 sql 连接的代码是 var query1 from u in dc Usage Computers where u DomainUser s3 select u selects all feilds from ta
  • Pyspark Spark DataFrame - 地图类型列中的聚合和过滤列

    My DataFrame好像 c1 c2 c3 A b 22 00 A b 23 00 A b 09 00 A c 22 00 B c 09 30 我想执行一些聚合并创建第二个DataFrame有 3 列 c1 是我想要分组的列 地图类别房
  • 将 Spark 数据帧写入单个 Parquet 文件

    我想做一些非常简单的事情 但我遇到了一些非常愚蠢的挣扎 我认为这一定与对 Spark 所做的事情的根本误解有关 我将非常感谢任何帮助或解释 我有一个非常大的表 3 TB 300MM 行 25k 分区 在 s3 中保存为 parquet 我想
  • ProcessBuilder 重定向到标准输出

    我想将 java 进程输出重定向到父 java 进程的标准输出 使用 ProcessBuilder 类如下 public static void main String args ProcessBuilder processBuilder
  • 每次获取不同的地址

    在下面的代码中 我每次都会为第一个元素获得不同的地址std vector v 为什么会这样呢 include
  • 将类标签附加到 Keras 模型

    我正在使用 Keras 顺序模型来训练许多多类分类器 在评估时 Keras 输出一个置信度向量 我可以使用 argmax 从中推断出正确的类 ID 然后我可以使用查找表来接收实际的类标签 例如字符串 到目前为止 解决方案是加载训练好的模型
  • 关闭子窗体时如何刷新datagridview?

    我的主窗体上有一个 dgv 有一个按钮可以打开另一个窗体以将一些数据插入到绑定到 dgv 的数据源中 我想要当子窗体关闭 dgv 自动刷新时 我尝试将其添加到子表单关闭事件中 但它不会刷新 private void frmNew FormC
  • 如何在C++中定义常量?

    我通过Mingw在windows上编译了一个linux程序 然而 转换并不完美 例如 在 Windows 上 输出是这样的 我得到 zu 而不是实数 Approximated minimal memory consumption Seque
  • Cholmod 错误“问题太大”到底意味着什么?将 dfm 转换为 df 时出现问题

    这是发布的另一个问题的新版本 现在有一个可重现的示例 我正在尝试将文档特征矩阵从 29117 条推文转换为 R 中的数据帧 但出现错误 asMethod object 中的错误 Cholmod 错误 问题太大 位于文件 Core cholm
  • 无限的列表是理智的吗?

    在Prolog中 是统一X 1 X 一种获得无限列表的明智方法 SWI Prolog 没有任何问题 但 GNU Prolog 只是挂起 我知道在大多数情况下我可以用以下内容替换列表 one 1 one X one X 但我的问题是明确是否可
  • 使用 Java Stream 从一组集合中收集所有对象

    我正在尝试学习 Java Streams 并尝试获得HashSet
  • 如何将日期转换为周数

    如何在 Excel 中将 20110114 YYYYMMDD 转换为周 例如 WK02 11 Thanks 首先将数字转换为日期 假设您的号码在 A1 单元格中 DATE LEFT A1 4 MID A1 5 2 RIGHT A1 2 然后
  • 如何让我的机器人忽略对话,直到直接解决该问题?

    我想将我的机器人添加到 Slack 频道 但我希望它忽略对话 直到直接解决它 例如 me hi me hi me bot hi bot why hello there 在 Microsoft Bot Framework v1 中 有一个选项
  • 将字符串转换为格式化日期

    我编写了 JavaScript 代码来读取名为的文本字段leave start and leave end并确定它们之间的日期 目前 我创建的日期如下所示 Mon Apr 6 2015 00 00 00 GMT 0400 但是 我希望每个日
  • SQL Server - 每个状态提取 X 条随机记录

    我有一个表 其中包含美国每个邮政编码的记录 为了在地图上显示 我需要为每个州选择 X 条随机记录 我该怎么做呢 Use WITH sample AS SELECT t ROW NUMBER OVER PARTITION BY t state
  • 如何不可知地从另一个 Django 模型链接任何对象/模型?

    我正在编写一个基于 Django 的简单 CMS 大多数内容管理系统依赖于固定页面 固定 URL 使用具有一个或多个可编辑区域的模板 要拥有可编辑区域 您需要一个页面 为了让系统确定哪个页面 您需要 URL 当您不再处理 页面 FlatPa
  • 当前工作目录到底是什么?

    我的书上说 计算机上运行的每个程序都有一个当前工作目录或 cwd 任何不以根文件夹开头的文件名或路径都假定位于当前工作目录下 由于我在 OSX 上 我的根文件夹是 当我输入时os getcwd 在我的 Python shell 中 我得到