M.H*_*mel 3 python macos python-3.x
我的书说:
在您的计算机上运行的每个程序都有一个当前工作目录或 cwd。任何不以根文件夹开头的文件名或路径都假定在当前工作目录下
因为我在 OSX 上,所以我的根文件夹是 /。当我在os.getcwd()Python shell 中输入时,我得到/Users/apple/Documents. 为什么我的 cwd 中出现 Documents 文件夹?是说 Python 正在使用 Documents 文件夹吗?没有任何以/( 根文件夹 )开头的指向 Python 的路径吗?另外,每个程序都有不同的 cwd 吗?
tri*_*eee 39
每个进程都有一个当前目录。当一个进程启动时,它只是从其父进程继承当前目录;例如,它没有设置为包含您正在运行的程序的目录。
如需更详细的解释,请继续阅读。
当磁盘变得足够大以至于您不希望所有文件都放在同一个地方时,操作系统供应商想出了一种在目录中构建文件的方法。因此,您可以在其中创建新集合和其他新集合(除了在某些早期实现中,目录不能包含其他目录!),而不是将所有内容保存在同一目录(或初学者现在被教导的“文件夹”)中。
从根本上来说,目录只是一种特殊类型的文件,其内容是其他文件的集合,其中还可以包括其他目录。
在原始操作系统上,故事就到此结束了。如果你想打印一个名为term_paper.txtwhich的文件spring_semester,该文件位于该目录中,而该文件2021又位于该目录中studies的目录中mine,那么你必须说
print mine/studies/2021/spring_semester/term_paper.txt
Run Code Online (Sandbox Code Playgroud)
(除了命令可能比 更神秘print,目录分隔符可能是一些疯狂的东西,比如方括号和冒号,或者其他东西;
lpr [mine:studies:2021:spring_semester]term_paper.txt
Run Code Online (Sandbox Code Playgroud)
但这对于本次说明并不重要),如果您想复制该文件,则必须将整个 enchilada 拼出两次:
copy mine/studies/2021/spring_semester/term_paper.txt mine/studies/2021/spring_semester/term_paper.backup
Run Code Online (Sandbox Code Playgroud)
然后出现了当前工作目录的概念。如果你可以说“从现在开始,除非我另有说明,我正在谈论的所有文件都将位于这个特定目录中”,该怎么办?因此,cd命令诞生了(除了在像 VMS 这样的旧系统上,它被称为更笨重的东西,比如SET DEFAULT)。
cd mine/studies/2021/spring_semester
print term_paper.txt
copy term_paper.txt term_paper.backup
Run Code Online (Sandbox Code Playgroud)
这就是全部内容了。当您cd(或在 Python 中,os.chdir())更改当前工作目录时。它会一直保留,直到您注销(或以其他方式退出此进程),或者直到您cd转到不同的工作目录,或者切换到您正在运行具有自己的当前工作目录的单独命令的不同进程或窗口。就像您可以在不同目录中使用多个窗口打开文件浏览器(Explorer 或 Finder 或 Nautilus 或其他任何名称)一样,您可以打开多个终端,并且每个终端都运行一个具有自己独立的当前工作目录的 shell。
因此,当您输入pwd终端(或cwd命令语言中调用的任何命令)时,结果将很大程度上取决于您之前在该窗口或进程中执行的操作,并且可能取决于您如何创建该窗口或进程。在许多类 Unix 系统上,当您创建一个带有关联 shell 进程的新终端窗口时,它最初是在您的主目录中打开的(/home/you在许多 Unix 系统上,/Users/you在 Mac 上,或多或少类似于C:\Users\you最近的 Windows 上),尽管可能您的终端可以配置为在其他地方打开(通常Desktop或Documents在某些表面上“现代”和“友好”的系统上的主目录中)。
许多初学者对于运行程序时发生的情况有一个模糊且不完整的心理模型。许多人会不断地cd进入包含其脚本或程序的目录,当您告诉他们不必这样做时,他们会感到真正的害怕和困惑。如果frobozz在/home/you/bin那么你不必
cd /home/you/bin
./frobozz
Run Code Online (Sandbox Code Playgroud)
因为你可以直接运行它
/home/you/bin/frobozz
Run Code Online (Sandbox Code Playgroud)
同样,如果ls在/bin你身上,绝对不会
cd /bin
./ls
Run Code Online (Sandbox Code Playgroud)
只是为了获取目录列表。
此外,就像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
Run Code Online (Sandbox Code Playgroud)
如果当前目录中不存在,则应该简单地open(sys.argv[1])失败并显示错误。file.txt我们再说一遍;它不会查找/home/you/bin-file.txt当然,除非这也是您(调用者)的当前工作目录,在这种情况下您当然可以简单地写
python script.py file.txt
Run Code Online (Sandbox Code Playgroud)
与此相关的是,许多初学者不必要地尝试类似的事情
with open(os.path.join(os.getcwd(), "input.txt")) as data:
...
Run Code Online (Sandbox Code Playgroud)
这不必要地调用os.getcwd(). 为什么是不必要的呢?如果您一直在关注,您已经知道答案:操作系统无论如何都会input.txt在当前工作目录中查找相对文件名(如此处的 )。所以你需要的是
with open("input.txt") as data:
...
Run Code Online (Sandbox Code Playgroud)
最后一句话。在类 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:\等(目录分隔符是反斜杠而不是斜杠,尽管您几乎可以在任何地方使用斜杠,这通常是一个好主意以保持你的理智)。
这与 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()
'/'
Run Code Online (Sandbox Code Playgroud)
这取决于您启动 python shell/脚本的位置。
您的 python 解释器位置取决于您启动它的方式,以及启动它后采取的后续操作,例如使用 os 模块导航您的文件系统。仅仅启动解释器就会把你放在你的 python 安装目录中(在不同的操作系统上不一样)。另一方面,如果您从编辑或运行特定目录中的文件开始,您的位置将是您正在编辑的文件的文件夹。如果您需要在某个目录中运行解释器并且您正在使用 idle,例如,最简单的方法是通过以一种或另一种方式创建一个 python 文件开始,当您编辑它时,您可以使用 Run > Python Shell 启动一个 shell将已经在该目录中。如果您使用命令行解释器,在运行 python/python3/py 命令之前,导航到要运行解释器的文件夹。如果您需要手动导航,您当然可以使用已经提到的以下内容:
import os
os.chdir('full_path_to_your_directory')
Run Code Online (Sandbox Code Playgroud)