Python物理学高效计算(txt+pdf+epub+mobi电子书下载)


发布时间:2020-12-01 12:20:20

点击下载

作者:(美)安东尼·斯科普斯(Anthony Scopatz) 凯瑟琳·赫夫(Kathryn D. Huff)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python物理学高效计算

Python物理学高效计算试读:

前言

欢迎阅读本书。本书将介绍物理学领域中需要用到的基本软件技能。囊括了从天体物理学到核工程等诸多领域,本书会将读者从不知道如何在计算机上将两个变量相加的新手,培养成团队中的软件开发大师。

物理与计算都有悠久的历史。在许多方面,计算机和现代物理学已经共同演变。只有密码学才能真正像物理学那样跟上计算机的发展。虽然共同成长,但物理学家并不是头等软件开发人员。物理学家通常会由于两个错误观点而吃亏:

1.软件开发和软件工程很容易;

2.会物理的人也会编写代码。

虽然一些技能可以互相转换,例如理解抽象符号对于物理和软件开发都很重要。但两者的基本关注点、需求、兴趣、结果的推导机制往往有很大区别。对于物理学家来说,计算机只是工具箱中的一个工具。在物理学中,计算的作用与数学的作用不同。人们可以在没有计算机的情况下了解物理概念,但使用计算机语言能够简化物理处理过程。此外,与计算尺、光子检测器、示波器都不相同,物理计算机是一个实验设备,正确设置后就能方便地辅助科学研究。由于计算机比上述实验装置都复杂也更可配置,所以需要更多的耐心、照料、理解,最终才能正确设置。

越来越多的物理学家需要在工作或研究中扮演软件开发人员的角色。这本书旨在帮助软件开发人员尽可能地轻松成长。长此以往,让物理学家更有成效地工作。

在另一方面,计算建模和模拟仿真已经在物理学中发挥着重要作用。当实验规模太大或太昂贵时,或者理论参数受限时,模拟科学就能够发挥重要作用。模拟能够帮助实验者在实践之前先对理论进行验证。模拟正在成为物理学家理论和实验的中间环节。许多模拟科学家更喜欢认为自己是偏理论的。实际上,模拟中用到的方法更接近实验主义。本书讲什么

所有现代物理学家无论以什么方式做实验,都会在科学工作流程的某些部分用到计算机。有些研究人员只用计算机处理文档。而其他人可能会使用计算机不知疲倦地收集数据,并在夜间进行数据分析,其效率超过研究团队中的大部分成员。本书介绍利用计算机实现并自动化几乎所有研究内容,在研究的每个阶段都能将本书作为指南来使用。

本书从各个角度介绍计算物理学。本书将帮助读者获得和锻炼对物理来说无价的软件开发技能。据我们所知,还不存在其他这样的图书。本书既不是物理教科书,也不是学习Python和其他编程概念的唯一方法。本书介绍当物理与编程相遇时会发生的事情,即计算物理学。相信你会喜欢的!本书目标读者

这本书适用于物理学领域需要进行一些开发工作的人。这里的“物理学领域”涵盖的范围比较广,包括物理学、天文学、天体物理学、地质学、地球物理学、气候科学、应用数学、生物物理学、核工程、机械工程、材料科学和电气工程等领域。本书中的“物理”一词,指的是这些广义上的物理和工程学,不是某个单一的研究领域。

虽然本书使用Python编程语言介绍,但书中的概念也适用于其他编程语言。这里选择Python是因为在各种情况下都能简单、直观地使用这门语言。当尝试学习计算物理学中的概念时,Python会脱颖而出。读者可以把在这里学到的技能应用到其他编程环境中。本书不适合哪些人

虽然欢迎任何人阅读本书并学习,但这本书的主要目标是让物理学者学习计算技能。书中的例子来自物理概念的实用知识。如果读者的主要工作是语言学家或人类学家,那么这本书可能不适合你。阅读本书不需要任何计算机或编程的知识。如果读者已经作为软件开发人员工作了好几年,那么这本书的作用就非常小。本书使用示例:辐射衰变常数

下面用一个例子来说明本书的用法。假设一个物理团队使用一个新的探测器来测量较高精度的镭同位素衰变常数。物理学家需要访问接收到的数据。他们可能想写一个小程序,将每个同位素的预期衰变情况作为时间当变量的函数。接着,科学家将从检测器收集实验数据,存储原始输出,然后将其与预期值进行比较,并发布关于比较差异的论文。由于科学家遵循科学宗旨并尊重他们的同事,因此一定会亲自测试所有的分析,并仔细地记录每一步过程。毕竟他们的同事需要为核素表中的数千个其他同位素重复这个过程。

访问数据和软件库

为了访问拥有核数据的库,例如对于每个同位素i当前接收到的的核衰变常数λ,科学家可能必须在文件系统中安装ENSDF数据库。i这需要用到shell(第1章)和构建软件系统(第14章)中介绍的知识。

创建一个简单的程序

同位素预期活动可作为时间的函数,该函数非常简单-10。但不管方程如何简单,没有人愿意每10秒就手工解算一次方程(或在Excel中复制和粘贴)。为此,第2章介绍了在Python编程语言中创建简单函数。而对于更复杂的数学模型,可能需要面向对象(第6章)、数值Python(第9章)和数据结构(第11章)方面的知识。

自动化数据收集

成熟的实验无需人为干预。换句话说,物理学家可以在家里睡觉,而实验室整夜无拘无束地运行着实验。在第1章和第2章中学习的技能可以帮助在实验中自动收集数据。而存储数据的方法需要用到第10章介绍的HDF5相关的知识。

分析和绘制数据

当获得模拟的值并收集完实验数据后,下一步是比较两个数据集。除了从第1章和第2章中学习到的知识以外,这一步还需要用复杂的工具来分析和可视化数据(第7章)。对于非常复杂的数据分析,通过并行(在第12章中介绍相关基础知识)同时使用多个处理器来加快工作速度。

跟踪改动

在科学中,重现性至关重要。为了确保科学家们可以重现软件结果,将分析流程回滚到以前的版本并重新绘图,科学家所有以前版本的代码和数据都应该使用版本控制。这可能是本书中最重要的一个工具。第15章介绍了版本控制的基础知识,第16章介绍在协作中使用版本控制。

测试代码

除了可重现之外,理论、数据收集、分析和绘图这些步骤必须确保是正确的。因此第17章将介绍如何调试软件和理解错误消息的基础知识。即使在调试之后,科学家依然担心软件中含有尚未察觉的错误,如果论文因此而撤稿,那么无疑是个灾难,因此科学家需要测试为项目编写的代码。第18章将介绍与语言无关的测试代码原则,以及用于测试Python代码的具体工具。

为代码提供文档

一直以来,物理学家都会记录计算的过程和方法。第19章介绍一些用来为代码创建用户手册的工具。该章将演示从含有注释的代码自动生成可在网上点击和发布的手册。即使在项目快结束时才开始添加文档,眼光长远的物理学家仍然可以使用第19章介绍的工具为后辈整理工作内容。在分享这些含有文档的代码时,就会用到许可证(第22章)和协作(第21章)方面的知识。

发布

一旦软件编写完成、测试正确和添加了文档,物理学家就可以进入重要的论文编写阶段。在成功的研究计划中,最终的回报是在同行评审的出版物中分享他们的研究成果。在生成数据并根据数据绘制图表后,实际的挑战往往刚刚开始。幸运的是,第20章将介绍能够提高作者科学文件编写效率的工具。阅读本书时应该做哪些事情

读者应该通过实践学习。笔者希望读者能够学到知识,因此需要跟着书中的例子练习。书中的例子贴近实际,并不是理论性的。在与Python相关的章节中,将学会启动一个Python会话。尝试自己编写示例中的代码,并修改书中的示例。自己编写代码能够加深对软件和物理的印象。

如果读者遇到问题,首先请尝试自己解决问题。读者也可以在网上搜索碰到的问题。问答网站Stack Overflow也能帮到你。如果还是没有进展,请随时与我们联系。本书只介绍了有限的知识。但只要读者有目标和想象力,就能不断学到计算物理学的新知识。

此外,读者可以随时跳过已经熟悉,或与工作无关的章节或主题。如果读者对某些内容不熟练或需要复习,可以随时回头来阅读。全书插入了很多前后引用的参考,所以不用担心跳过了重要的东西。书中将相关内容放在一起,以便了解相关内容的前因后果。这本书既是一个人的科学之旅,也是一本参考手册。请读者同时以这两种方法使用本书。本书约定

本书中使用以下印刷约定:

斜体

表示网址、电子邮件地址、文件名和文件扩展名。

等宽字体

用于程序代码,以及段落中的引用程序元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。 表示提示或建议。

  表示一般注释。

  表示警告。

本书还使用了相当数量的“代码标注”。这是编码示例用数字注释的地方。例如:print("This is code that you should type.")(1)(1)用来对正在编写的软件进行说明。

这种方式可以帮助读者关注代码中的特定部分,并逐步解释发生的事情。读者输入代码时不用输入这些数字,这些数字并不是代码的一部分。使用实例代码

读者可从https://github.com/physics-codes/examples下载补充材料(代码示例、练习等)。

这本书是为了帮助读者完成相关的工作。一般来说,读者可以在程序和文档中使用本书提供的示例代码。除非需要复制代码的重要部分,否则无需与我们联系。例如,编写一个程序,其中用到了本书中多个代码块是无需许可。而出售或分发含有从O'Reilly的书中示例的CD-ROM的例子需要许可。引用本书和引用示例代码来回答问题不需要许可。将本书中的大量示例代码并入产品文档中需要获得许可。

我们不要求标明出处,但如果标出的话,我们对此表示赞赏。出处通常包括标题、作者、出版商和ISBN。例如:“Effective Computation in Physics by Anthony Scopatz and Kathryn D. Huff (O’Reilly). Copyright 2015 Anthony Scopatz and Kathryn D. Huff, 978-1-491-90153-3.”

如果读者觉得自己对示例代码的使用方式不符合上面介绍的情形,可随时通过permissions@oreilly.com与我们联系。安装和设置

本书将介绍如何使用和掌握许多不同的软件项目。这意味着读者必须在计算机上拥有大量软件包才能跟着本书学习。幸运的是,近年来安装软件包的过程已经大大简化了。本书将使用conda包管理器来安装所需的软件。

第1步:安装和下载Miniconda(或Anaconda)

读者需要下载并安装Miniconda,或者安装Anaconda。Miniconda是Anaconda的精简版本,两者只要安装一个就可以了。Miniconda是Conda附带的Python发行版,本书将使用这个工具安装所需要的所有其他东西。从Conda网站可以下载到适合读者所用系统的Miniconda版本。包括Linux、Mac OS X、Windows版本,32位和64位体系结构。安装Miniconda时并不需要拥有计算机的管理员权限。虽然本书中的所有示例都可用于Python 2,但笔者建议读者安装Python 3版本。

如果读者在Windows上,建议使用Anaconda,因为该工具可解决其他软件包中的一些安装问题。在Windows上也可以双击Miniconda的可执行文件,按照安装向导中的说明来安装Miniconda。 如果在Windows上没有安装Anaconda,请安装msysGit和Git Bash如果读者在Windows上没有安装Anaconda,请先下载并安装msysGit(可在GitHub上找到)。这款工具提供了名为Git的版本控制系统以及bash shell,书中会介绍这两个工具。Windows上没有提供msysGit,也无法通过Miniconda安装。msysGit默认的安装设置就应该足够满足这里的需求了。

如果读者在Linux或Mac OS X上,首先打开终端应用程序。如果读者不知道终端的位置,请使用操作系统的搜索功能查找。打开终端后,在美元符号($)后输入以下内容。注意,读者可能需要更改文件名(即Miniconda-3.7.0-Linux-x86_64.sh这部分)中的版本号,以匹配所要下载的文件:# On Linux, use the following to install Miniconda:$ bash ~/Downloads/Miniconda-3.7.0-Linux-x86_64.sh# On Mac OS X, use the following to install Miniconda:$ bash ~/Downloads/Miniconda3-3.7.0-MacOSX-x86_64.sh

这里已经将Miniconda下载到默认的下载目录〜/ Downloads中,下载的文件是64位版本,如果读者使用的是32位版本,则必须相应地调整文件名。

在Linux、Mac OS X、Windows上,当安装程序询问是否要自动更改或更新.bashrc文件或系统PATH时,选择是。这将使Miniconda自动进入系统环境,简化将来的安装步骤。所有其他安装选项使用默认设置即可。

第2步:安装软件包

安装完Conda后就可以安装本书所需的软件包。在Windows上请打开命令提示符cmd.exe。在Linux和Mac OS X上请打开终端。读者可能需要打开一个与安装Miniconda不同的新终端窗口才能生效。现在无论读者的操作系统是什么,都可以输入以下命令:$ conda install --yes numpy scipy ipython ipython-notebook matplotlib pandas \pytables nose setuptools sphinx mpi4py

可能需要几分钟下载相关软件,之后就可以开始工作了!®Safari 在线图书

Safari 在线图书(Safari Books Online)是一家按需服务的数字图书馆,提供来自出版商的技术类和商业类专业参考书目和视频。

专业技术人员、软件开发人员、Web设计师、商业和创意专家将Safari Books Online作为他们研究、解决问题、学习和认证培训的主要资源。

Safari Books Online为组织、政府机构和个人提供一系列的产品组合和定价计划。用户可以在一个来自各个出版社的完全可搜索的数据库中访问成千上万的书籍、培训视频和正式出版前的手稿,这些出版社包括:O’Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、 Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等。欲获得有关Safari Books Online的更多信息,请在线访问我们。联系方式

美国:

  O’Reilly Media, Inc.

  1005 Gravenstein Highway North

  Sebastopol, CA 95472

中国:

  北京市西城区西直门南大街2号成铭大厦C座807室(100035)

  奥莱科技术咨询(北京)有限公司

我们有个关于本书的网页,上面有勘误表、示例和所有的附加信息。可以通过以下链接访问:http://bit.ly/thoughtful-machine-learningwith-python。

关于本书的评论和技术问题,请发邮件给bookquestions@oreilly.com。

关于本书的更多信息,如教程、会议、新闻,请参见网站:

http://www.oreilly.com

http://www.oreilly.com.cn致谢

衷心感谢Greg Wilson和Software Carpentry。你们所做的工作深刻影响了计算科学,为本书的出现创造了条件,对社会做出了不可低估的巨大贡献。

同样,还要感谢Paul P.H. Wilson和Hacker Within这些年对我们的支持。您一直力争大家不要被职位和年龄束缚,彼此之间互相学习,了解之前不知道的东西。

还要特别感谢Stephen Scopatz和Bruce Rowe提供的无微不至的帮助。没有这些帮助,这本书将永远不会出现。

非洲数学科学研究所对科学计算起到了巨大帮助,即使我们这样已经工作多年的人也是如此。你们的工作启发了这本书,我们希望这本书能回馈你们的学生。

我们还要感谢本书的审核人员:Jennifer Klay、Daniel Wooten、Michael Sarahan、DeniaDjokić。

向世界各地咖啡馆的咖啡师致敬。第1部分起步第1章 命令行简介

命令行,也称shell,为用户和计算机内部之间提供了功能上强大且透明的接口。至少在Linux或UNIX中,命令行可以无障碍访问决定当前计算机状态的文件和进程(包括操作系统本身的文件和进程)。

通过命令行可以安装和运行许多与物理相关的数值工具。命令行这种直观的接口不仅能提升物理学家对物理的好奇心,而且有些工作只能通过命令行来完成。对读者来说,命令行可能像黑客帝国中的充满绿色字符的画面,但不要让电影误导了你。下面来了解真实的命令行。1.1 Shell概览

在Linux或UNIX上可以打开一个终端模拟器(termimal emulator,简称为终端)来访问shell,而在Windows上有类似的Git Bash软件。启动终端会打开一个交互式的shell程序,它可以运行可执行程序。shell提供了命令行界面(command-line interface,用来运行命令以及浏览计算机中的文件系统(只要该shell连接上这台计算机即可)。命令行有时也称为“提示符”(prompt),在本书中以美元符号($)表示,表示在光标处可以输入内容,如图1-1所示。

shell强大且透明,能够无障碍地访问计算机上的文件和进程。那么shell到底是什么呢?图1-1 一个终端实例

1.1.1 Shell是一款编程语言

shell是由终端运行的编程语言。与其他编程语言相似,shell有以下特点。● 将多个操作组合成一个实体。● 获取输入。● 生成输出。● 有变量和状态。● 语法比较繁琐。● 使用特殊字符。

编程语言种类繁多,shell同样如此。在众多shell中,本书将使用最常见的bash。除此之外,还有csh、tcsh和ksh也很流行。表1-1列出了这些shell的特性。表1-1 Shell的种类Shell名 称说  明shBourne shell最著名的shell,开发于1977年,至今所有UNIX系统上都有安装cshC shell由sh改进而来kshKorn shell反向兼容sh,但借鉴了其他shell的一些特点bashBourne again sh的自由软件替代品,但进行了大范围改进shelltcshTenex C shell由C shell更新扩展而来

  练习:打开一个终端1.在计算机上找到一个名为Terminal的程序。在Windows上使用Git Bash作为bash终端。2.打开该程序进入shell。

shell强大之处在于其透明性,即shell可以直接访问整个文件系统,因此几乎能够完成所有任务,如查找文件、处理文件、安装软件库,以及在终端中运行提供了软件路径的程序。

1.1.2 路径和pwd

文件的所在位置是由一系列嵌套的目录(文件夹)组成的。按照UNIX的说法,每个目录的位置(以及其中的文件)都由路径来指定。这种路径可以是绝对路径,也可以是相对路径。

如果路径是从文件系统目录树的顶部开始,那么即为绝对路径。文件系统目录树的顶端称为根目录。根目录的路径为/。因此绝对路径都以/开头。

在许多UNIX和Linux系统中,根目录中含有bin和lib这样的目录。bin和lib目录的绝对路径分别为/bin和/lib。图1-2显示了一个目录树的示例图,其中包含了一些路径的表示方法。 “/”语法除了在路径起始处表示顶层目录外,还可用来分割路径中目录的名称,如图1-2所示。图1-2 目录树示例

路径也可以用与当前工作目录的相对位置来表示。当前工作目录以一个点表示(.),该目录的父目录以两个点表示(..)。因此,相对路径通常以这两者开头。

前面已经提到,绝对路径描述的是某个文件相对于根目录的位置。而相对路径描述的是与当前工作目录的相对位置。将两者的概念统一起来,用户可以用pwd(print working directory,当前工作目录)命令打印出当前工作目录完整的绝对路径。

20世纪30年代,Lise Meitner发现中子诱发裂变的理论框架时,Bash还未诞生。如果能够使用Bash,Meitner教授的研究计算机也许会包含一系列的目录,其中含有她关于裂变理论的文件,以及关于理论应用方面的文件(参见图1-2)。现在来看一下Lise会如何组织这个目录结构。 在本书中读者会跟着Lise一起操作。同时这一章用到的目录树在GitHub上会作为一个库发布。读者可以根据GitHub上页面中的指示来下载相关文件。

当Lise工作时,她会在命令提示符中输入命令。在下面的例子中,可以看到命令提示符在美元符号前面有一个简写的路径名称(有时会是其他内容)。该路径为~/fission,因为fission是Lise的当前工作目录。~/fission $

当Lise在这个命令提示符后输入pwd并按回车后,shell会在当前行的下一行输出当前目录的完整路径。~/fission $ pwd/filespace/people/l/lisemeitner/fission/

比较这里的绝对路径与对应的缩写提示符,会发现在提示符中,当前目录之前的所有目录(包括lismeitner目录),都替换为一个波浪线(~)。在下一节会解释这个波浪线。

1.1.3 主目录(~)

shell会从一个称为主(home)目录的特殊目录来启动会话。波浪线(~)字符用来表示主目录。因此,登录后会看到命令行提示符告知用户现在正处于主目录中。~ $

提示符并不是千篇一律的,有时也会显示用户名和计算机名。@:~ $

Lise拥有著名的凯撒·威廉研究院(Kaiser Wilhelm)的研究职位,因此她使用的提示符也许会是:meitner@kaiser-wilhelm-cluster:~ $

回到前面的例子中,比较一下目录:~/fission

和/filespace/people/l/lisemeitner/fission

看上去波浪线完全替换掉了主目录的路径(/filespace/people/l/lisemeitner)。确实,波浪下是主目录路径的缩写,即从根目录开头到主目录的字符串。由于该路径是针对目录树顶层的相对位置,因此:~/fission

和/filespace/people/l/lisemeitner/fission

都是绝对路径。 练习:找到主目录1.打开终端。2.在命令提示符中输入pwd并按下回车,查看主目录的绝对路径。现在Lise知道她在文件系统中的位置,同时也很好奇这里藏了些什么东西。为了列出一个目录下的所有内容,Lise需要ls这个命令。

1.1.4 列出内容(ls)

ls命令能够让用户打印出一个目录下所有的文件和子目录。 练习:列出一个目录的所有内容1.打开终端。2.在命令提示符中输入ls并按回车键,查看主目录的内容。

在Lise的主目录下的fission目录中,ls会以列表的形式输出其内容:~/fission $ ls (1)applications/ heat-production.txt neutron-release.txt (2)(1)在她的主目录下的fission目录中,输入ls并按回车键。(2)shell会列出当前目录下的内容。

当Lise列出当前目录下的内容时,会看到两个文件和一个子目录。如前面的例子所示,在shell中,目录可能会以不同的颜色显示,或在目录名的末尾加一个斜杠(/)以示区分。

Lise还可以为ls命令提供参数。若想不进入applications目录就可以列出其中的内容,可以执行下面这个命令:~/fission $ ls applications (1)power/ propulsion/ weapons/ (2)(1)Lise没有进入applications目录就列出了其中的内容。(2)shell显示了applications目录下含有的3个目录。

ls命令能够告知Lise她的文件系统中目录的内容。但为了可以实际访问这些目录,Lise需要用到cd命令。

1.1.5 更改目录(cd)

Lise可以使用cd命令改变目录。当她只输入这两个字符时,cd命令会假设她要转到主目录,如下所示:~/fission $ cd (1)~ $(1)将目录更改为默认位置,即主目录。

从这个例子中可以看到,不提供参数就执行cd会改变命令提示符。提示符反映了当前的工作目录为主目录(~)。为了核实一下,我们可以使用pwd命令就会以绝对路径的形式打印出主目录。~ $ pwd (1)/filespace/people/l/lisemeitner (2)(1)打印出当前工作目录。(2)shell显示了当前工作目录的绝对路径。

也可以为cd命令提供参数,在cd命令后提供一个参数能指定其行为:~/fission $ cd [path]

如果Lise在cd后添加一个空格和另一个目录路径,那么shell会转到那个目录。参数既可以是绝对路径,也可以是相对路径。 尖括号和花括号的约定尖括号是约定俗成的术语,其中的内容需要替换为真实值。读者不要敲入<和>之间的内容。因此,如果看到cd ,应该输入类似cd mydir这样的内容。方括号([])用来表示可选的内容。同样,如果有方括号,也不要输入其中的内容。而两个方括号([[]])则表示只有在外层方括号可选参数存在的情况下,里面才会有一个可选参数。

在下面这个例子中,Lise使用绝对路径来跳转到一个子目录中。这会改变当前的工作目录,在提示符的下一行中会看到这个改动:~ $ cd /filespace/people/l/lisemeitner/fission (1)~/fission $ (2)(1)Lise使用完整的绝对路径转到了fission目录。这个命令的意思是“将目录转到根目录中,然后转到filespace目录,接着转到people目录,最后转到fission目录中”,Lise输入完命令后按下了回车键。(2)现在Lise位于~/fission目录下,提示符也有相应的改动。

当然,这样需要输入很多内容。前面学到过,波浪号(~)代表home目录绝对路径。因此用~能够方便地简化这个路径,所以前面那个非常长的路径可以替换为~/fission:~/ $ cd ~/fission (1)~/fission $(1)波浪线表示home目录,所以可以缩短之前那条非常长的路径,同时结果完全相同。

另外一个简洁的方式是为cd提供相对路径作为参数。相对路径描述了某个目录与当前目录的相对位置。如果Lise想要进入当前目录的子目录,则可以省去当前目录名称之前的所有内容。因此,从fission目录到applications目录只须使用该目录的名称:~/fission $ cd applications (1)~/fission/applications $(1)如果想要这条命令执行成功,要确保applications目录必须位于当前目录中。

如果目录不存在,bash就无法进入那个位置并会报告一个错误消息,如下所示。注意,读者也许已经猜到,bash会留在原来的目录中:~/fission $ cd biology-bash: cd: biology: No such file or directory~/fission $

另一个有用的约定是,在使用相对路径时,当前目录可以用一个点号表示(.)。所以执行cd ./power与执行cd power完全相同:~/fission/applications/ $ cd ./power (1)~/fission/applications/power/ $(1)进入applications目录,然后再进入power目录。

与之类似,当前目录的父目录用两个点表示(..)。所以如果Lise决定返回上一级,回到applications目录,需要用到下面的语法:~/fission/applications/power/ $ cd ..~/fission/applications/ $

有了两个点的表示方法,相对路径不仅能指向当前目录的子目录,还能够指向其他任何地方。例如,相对路径../../../表示的是当前目录往上数第三个目录。 练习:更改目录1.打开终端。2.在命令提示符中输入cd..,从主目录转到其父目录中。3.使用相对路径转回主目录中。4.如果读者从本书的GitHub库中下载了Lise的目录树,那么能否使用ls、cd、pwd转到那个目录中?

表1-2总结了一些路径缩写。表1-2 路径缩写语  法含  义/文件系统的根目录或顶层目录(也可用来分割路径中目录的名称)~home目录.当前目录..当前目录的父目录../..当前目录父目录的父目录

列出文件和目录的名称的确很有帮助,但找到某个文件更多的原因是为了了解其内容。Shell为此提供了许多工具。下一节将介绍如何查看某个感兴趣文件的内容。

1.1.6 查看文件内容(head和tail命令)

当在科学计算程序中处理文件的输入和输出时,通常只需要查看文件的开头或结尾(例如,检查某些重要的输入参数,或检查是否成功运行完程序)即可。head命令会输出指定文件的前10行。~/fission/applications/power $ head reactor.txt# Fission Power IdeaThe heat from the fission reaction could be used to heat fluids. In the same way that coal power starts with the production heat which turns water to steam and spins a turbine, so too nuclear fission might heat fluid that pushes a turbine. If somehow there were a way to have many fissions in one small space, the heat from those fissions could be used to heat quite a lot of water.

读者可能已经猜到,tail命令会输出最后10行。~/fission/applications/power $ tail(原书为head,是错的)reactor.txtthe same way that coal power starts with the production heat which turns water to steam and spins a turbine, so too nuclear fission might heat fluid that pushes a turbine. If somehow there were a way to have many fissions in one small space, the heat from those fissions could be used to heat quite a lot of water.Of course, it would take quite a lot of fissions.Perhaps Professors Rutherford, Curie, or Fermi have some ideas on this topic. 练习:查看一个文件1.打开计算机上的一个终端程序。2.找到一个文本文件。3.使用head和tail命令在终端中输出该文件的起始和末尾的文本。

在检查文件时,这种在终端中输出文件起始和末尾若干行的功能非常有用。学完这些内容后,我们后续的任务是创建、编辑、移动文件。1.2 操作文件和目录

除了查找文件和目录这些简单的工作之外,shell还能用于进一步的处理,如对文件和目录进行复制、移动、删除,以及更加复杂的合并、比较、编辑等操作。接下来的章节将详细地探讨这些任务。

1.2.1 创建文件(nano、emacs、vi、cat、>和touch)

读者能通过以下方式来创建文件:● 使用图形用户界面(GUI)(如记事本、Eclipse或IPython

Notebook)。● 使用touch命令。● 在命令行中使用cat和重定向(>)。● 在终端中使用复杂的文本编辑器,如nano、emacs、vi。

在编程中,每个方式都有各自的用途。使用GUI创建文件

本书的读者有时会使用图形用户界面(GUI)来创建文件。例如用Microsoft Paint创建.bmp文件,用Word创建.doc文件。虽然这些文件不是在终端中创建的,但通常在文件系统中可见,并且能在终端中操作这些文件。但终端的功能是有限的,由于这些文件不是纯文本文件,其中含有人类不可读的二进制数据,所以必须通过GUI软件来打开。

而源代码文件是纯文本文件。不同语言的源代码文件有不同的扩展名,例如。● .cc表示C++。● .f90表示Fortran 90。● .py表示Python。● .sh表示bash。

虽然源码文件可能有不同的扩展名,但本质上都是纯文本文件。除了专门用于创建纯文本文件的程序外,一般不应在GUI软件(如Microsoft Word)中创建纯文本文件。在创建并编辑特定语言的源代码文件时,软件开发人员经常使用交互式开发环境(IDE),即专门的GUI软件,其中含有相关语言的辅助功能,并能够生成纯文本代码文件。不同的语言选择不同的IDE。例如MATLAB可以用来创建.m文件,而IPython Notebook可用于创建.ipynb文件。

有些人借助IDE极大地提升了编码效率,而另一些人则喜欢不离开终端就能处理所有文本文件的工具。这种类型的文本编辑器是许多计算科学家的必备工具,相当于一把能锤任何类型钉子的锤子。创建空文件(touch)

使用touch命令可以在终端中创建空的文本文件。即touch命令后跟一个文件名,就可以创建一个以该名称命名的空文件。

假设Lise想要创建一个文件用来记录核裂变应用方面的新想法,例如远距离(如向西伯利亚)提供热源。可用touch命令创建该文件:~/fission/applications $ touch remote_heat.txt

如果文件已存在,touch命令并不会修改其中的内容。所有文件都具有元数据,此时touch只会用新的“最近编辑”时间戳更新文件的元数据。如果文件不存在,则创建新的文件。 注意remote_heat.txt文件的名称使用的是下划线,而不是空格。这是因为文件名中的空格在命令行中容易出错。因为命令行使用空格分隔参数,所以含有空格的文件名可能会产生歧义,因此要尽量避免在文件名中使用空格。如果一定要使用,那么转义字符(\)可以告诉shell这是文件名中的空格。比如这就是一个具有空格的文件名:my\ file\ with\ spaces \ in \ its \ name.txt。

虽然用touch可以创建空文件,但编写代码的计算科学家还需要向源码文件中添加文本,因此需要用到文本编辑器。最简单的文本编辑器(cat和>)

在不离开终端的情况下,添加文本的最简单的方法是使用名为cat的程序和shell语法>,>语法称为重定向。

cat命令旨在将文件连接在一起。将一个文件名作为cat的参数,cat会在终端窗口打印文件的完整内容。为了输出reactor.txt中的所有内容,Lise可以像下面这样使用cat:~fission/applications/power $ cat reactor.txt# Fission Power IdeaThe heat from the fission reaction could be used to heat fluids. In the same way that coal power starts with the production heat which turns water to steam and spins a turbine, so too nuclear fission might heat fluid that pushes a turbine. If somehow there were a way to have many fissions in one small space, the heat from those fissions could be used to heat quite a lot of water.Of course, it would take quite a lot of fissions.Perhaps Professors Rutherford, Curie, or Fermi have some ideas on this topic.

cat的这种功能与重定向结合起来即可将一个文件的输出推送到另一个文件中。这即为重定向,顾名思义,即重定向输出。重定向的语法是大于符号(>)。箭头收集其前面命令的所有输出内容,并将其重定向到箭头后面的任何文件或程序中。如果后者是已存在的文件,则会覆盖其中的内容。如果文件不存在,则创建新的文件。例如下面的语法将reactor.txt的内容推送到名为reactor_copy.txt的新文件中:~fission/applications/power $ cat reactor.txt > reactor_copy.txt

如果cat后面不提供任何文件名,则会从命令提示符中接收输入。杀死或中断程序 在上面的练习中需要使用Ctrl+D来终止cat程序。终止程序很常见,比如有时候正在运行一个程序,但后来需要改进或发现程序不正确,需要停止执行。此时需要用到Ctrl+C来终止这些非交互式程序。而交互式程序(如less)通常定义其他快捷键来终止或退出程序,一般使用Ctrl+D。举个例子,yes是一个永不终止的程序。如果调用yes,会在终端中无限输出字母y。用户可以使用Ctrl+C退出程序。~/fission/supercritical $ yesyyyyyyyyCtrl+c 练习:了解命令1.打开终端。2.输入cat并按下回车键,光标将移动到空白行。3.尝试输入一些文本。注意每次按回车键时都会重复显示输入的文本。4.退出时需要按下Ctrl+D。即按住Ctrl键并同时按下大写字母D键。

使用这种方式,cat会读取命令行中输入的所有文本,并再次显示出来。这种功能与重定向结合起来,就能在命令行中向文件添加文本。因此,为了将命令行中的文本插入到remote_heat.txt文件中,可以使用以下语法:~fission/applications/power $ cat > remote_heat.txt

输入完上述命令并按回车键后,光标将移动到空白行。此时输入的任何文本都将插入到remote_heat.txt中。若要停止添加文本并退出cat,需要按下Ctrl+D。 注意,如果重定向的文件不为空,则会先清空其中的内容,然后才会添加新的文本。

使用cat是向文件中添加文本的最简单的方法。但是由于cat无法让用户编辑文件,因此,它不算是一个非常强大的文本编辑器。毕竟,很难能够一次就完美地输入文件的完整内容。幸运的是,还有更强大的文本编辑器能够更有效地编辑文本。更强大的文本编辑器(nano、emacs、vim)

使用文本编辑器能更有效地创建和编辑文件。文本编辑器是允许用户创建、打开、编辑和关闭纯文本文件的程序。文本编辑器有很多种。nano是其中一种简单的文本编辑器,建议新手用户使用。编程圈中最常见的文本编辑器是emacs和vim。这两种编辑器功能更强大,但学习曲线也更为陡峭。

在命令行中输入相应的名称就能打开对应的文本编辑器。如果文本编辑器的名称后面是已有文件的名称,则文本编辑器会打开该文件。如果文本编辑器的名称后面跟有目前不存在的文件的名称,则编辑器会创建并打开该文件。

若要使用nano文本编辑器打开或创建remote_heat.txt文件,Lise可以使用以下命令:~fission/applications/power $ nano remote_heat.txt

图1-3显示了在终端中打开的nano文本编辑器的界面。请注意,界面底部列出了用于保存、退出和执行其他任务的快捷键命令。图1-3 nano文本编辑器

如果Lise想要使用vim文本编辑器,则可以在命令行中以相同的方式输入vim或vi。在大多数现代的UNIX或Linux计算机上,vi是vim的简称(vim是vi improved)。若要使用emacs,需要输入emacs命令。选择编辑器,而不是选边站队 数十年来,程序员一直在争论哪款文本编辑器最好,这场论战一直没有结束。在这个论战中,主要的两派分别是emacs和vim这两大先驱。而作者希望读者能够以包容的心态看待问题。比如我们要无条件地尊重每个人的生活方式,在文本编辑器的选择上也应该如此。虽然使用不同的文本编辑器在编程时会有不同的工作效率和体验。但这些选择不是一成不变的,不能因此对用户产生偏见。

由于编辑器非常强大,所以许多文本编辑器的学习曲线都很陡峭。使用强大的文本编辑器需要先掌握许多命令和快捷键。因此新手应该考虑从nano开始,nano是一种功能简单但易学的文本编辑器。 练习:打开nano1.打开终端。2.执行命令nano。3.向文件中添加一些文本。4.根据窗口底部的提示来命名并保存文件,然后退出nano。

1.2.2 复制和重命名文件(cp和mv)

现在已经知道如何创建文件,接下来学习如何移动和更改文件。使用cp命令能够创建文件的副本。cp命令的语法为cp 。第一个必要参数是源文件(要复制的文件),可以使用相对路径或绝对路径。第二个参数是目标文件(新的副本本身),使用相对路径或绝对路径:~/fission/applications/power $ lsreactors.txt~/fission/applications/power $ cp reactors.txt heaters.txt~/fission/applications/power $ lsreactors.txt heaters.txt

但如果目标位于另一个目录中,则该目录必须已存在,否则cp命令将报告一个错误:~/fission/applications/power $ cp ./reactors.txt ./electricity/power-plant.txtcp: cannot create regular file `./electricity/power-plant.txt':No such file or directory

如果Lise在复制文件时无需保留原始文件,则可以使用mv(move)。该命令不会复制文件,而是重命名文件。该命令名为“move(移动)”,是因为如果第二个参数是另一个目录的路径,该命令会将文件移动到那里。

假设Lisa在浏览她之前的灵感时,注意到在propulsion目录中有关于核动力飞机的文件:~/fission/applications/propulsion $ lsnuclear_plane.txt

核动力飞机实际上是个非常糟糕的主意。核动力飞机会笨重到无法起飞。因此Lisa决定重新命名这个文件,来告诫其他人。这个主意应该命名为bad_idea.txt。mv命令接收两个参数:一个是原始文件的路径,另一个是新的文件路径。她想将nuclear_plane.txt重命名为bad_idea.txt:~/fission/applications/propulsion $ mv nuclear_plane.txt bad_idea.txt(1)~/fission/applications/propulsion $ ls(2)bad_idea.txt(3)~/fission/applications/propulsion $ mv ./bad_idea.txt ../(4)~/fission/applications/propulsion $ ls .(5).bad_idea.txt power/ propulsion/ weapons/ (6)(1)将nuclear_plane.txt移动(重命名)为bad_idea.txt。(2)显示目录的内容。(3)该文件现在为bad_idea.txt。(4)尝试将bad_idea.txt移动到applications目录中。(5)列出applications目录的内容来查看结果。(6)重命名的文件现在位于applications目录下的propulsion目录中。

当所有文件都正确命名后,Lise可能需要新的目录来组织这些文件。此时需要 mkdir命令。

1.2.3 创建目录(mkdir)

使用mkdir(make directory,创建目录文件)命令能够创建新目录。结合前面介绍的路径表示方法,用户不仅能够在当前目录中创建目录,也可以在任何地方创建目录。比如在研究关于核子的新理论时,Lise可能决定在theories目录中创建一个名为nuclear的目录。则可以使用mkdir命令以指定的路径创建一个新目录:~/theories $ mkdir nuclear

创建时,既可以使用相对路径也可以使用绝对路径。为了在新的nuclear目录中创建一个新的目录,可以指定一个较长的路径层次:~/theories $ mkdir ./nuclear/fission

但请注意,不能在不存在的目录中创建新文件,这个规则也适用于新目录:~/theories/nuclear $ mkdir ./nuclear/fission/uranium/neutron-inducedmkdir: cannot create directory `./nuclear/uranium/neutron-induced':No such file or directory

在命令行上创建这样的目录可以更好地组织文件,减少相关的开销。当然,有时可能会错误地创建文件或目录,此时需要用到rm命令。

1.2.4 删除文件和目录(rm)

删除文件和目录可以使用rm(remove)命令。回想一下,在applications目录中有一个记录了坏主意的文件:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载