社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

VS Code + GitHub + LaTeX 高效科研

happy科研 • 1 年前 • 255 次点击  

介绍

我们大部分人都已经慢慢有了自己的工作方式,比如主要用哪个软件编程,也有了自己的工作流,编程,出图,保存,展示等。但是如果回头看,这些方式实际上是在最开始接触科研时选择的工具上慢慢发展的。就是说,并不代表一定是高效的方式。

本文主要分享自己最近的编程体验。主要包括:

  • 使用vs code作为主力编程软件。
  • 使用GitHub同步代码和控制版本。
  • 使用Latex保存图件和笔记,并展示讨论。

我记得我在研一的时候选修过一门《python 空间数据分析》的课,老师主要介绍gdal。现在想来当时老师也是奇葩得很,他说他见过的国外研究人员,都直接选择在命令行里敲python。所以他在课上让我们在命令行里敲python, 然后开始import,完事了还得exit()。现在仍然记得自己当时Linux和python代码混在一起分不清楚的恐惧。后来也在其他地方见过什么评论说大神都用文本编辑器敲代码之类的X话。

我都不想加限定条件,正经敲代码,选择合适的工具(不包括命令行和文本编辑器)是第一步。因为Markdown和python代码的完美结合,以及逐行运行输出的特点,jupyter notebook成了大部分科研人员的首选,之前的推送中已经指出过这个工具的诸多不便。也许另外一个经常听说的软件叫anaconda,但是anaconda本身并不是一个敲代码的地方,对我来说,安装它就是为了用conda, 我用conda也就干两件事,conda create新建一个环境,conda install新安装一个包。前者在你电脑上新建一个全新的python环境,这样在这个环境里安装什么包都不会影响其他环境,后者相比于pip安装,优势在于会自动安装该包依赖的其他包。当然windows上anaconda会绑定安装一个叫Spyder的IDE,也有人用它编程。这里就提到了IDE,全称叫integrated development environment (IDE),也可以看作是用于编程的一类软件的总称。如果我们排除text editor,IDE有时候也被看作是notebook的对立面。但实际上在好些IDE内部也是可以使用notebook的。

Python编程常听说的IDE有pycharmVisual Studio Code (vs code),前者专注于python开发,后者算是一个集成的平台,各种语言都很方便。pycharm功能非常全面,但是也非常复杂,比如常见的Find功能  ctrl+F这种操作,在里面也能玩出花来。而vs code介绍的第一句就包括light weighted,轻量化的软件,做简单真是一件非常难的事。所以本文推荐的IDE是vs code.

正如开头说的,熟悉的方式并不是高效的方式,我的方式当然也不是你高效的方式。因此有必要交代一下我的硬件环境。首先我需要处理大量数据,而这些数据存储在我们所的超算(Levante)上,同时处理这些数据也完全超出了本地算力的能力,所以需要远程连接超算。其次,我用的是MacBook。还有一些软件支持,比如gwdg提供的在线markdown和latex工具等,可以很容易实现多设备同步。

基于GitHub的科研项目

一个高效的科研项目不应该只是单个文件夹。建议一切从GitHub开始。

新建一个空project 在github上新建一个repository, 拷贝code下面的链接。在vs code 的welcome界面,选择clone Git Repository (可能需要登陆等环节),利用vs code打开该项目。

添加基本要素 上面我们操作新建了一个空项目,这个example repository (https://github.com/lkluft/example-python)展示了一个repository应该具有的基本要素。不想深究的同学可以直接拷贝,然后根据以下说明修改。

  • .gitignore: 告诉git命令,哪些内容的变化需要忽略。比如data文件夹通常很大,不需要总是同步到GitHub,就可以在这个文件中标注忽略。

  • environment.yml :GitHub的目的之一,是让你的代码可以被复现。经常有些时候,代码在自己电脑上没什么问题,别人运行就是报错,原因之一就是版本不一致。所以,每一个项目,应该有一个自己独立的运行环境,前面我们介绍了利用conda可以新建一个不受其他环境干扰的新环境。此处类似,只是新建该环境的所需要的基本信息被写进了environment.yml,比如该环境的名字,需要安装哪些包等。可以运行以下命令新建该环境(需要cd到.yml文件所在的文件夹):

     conda env create -f environment.yml
     conda activate mypackage

    环境新建完成之后,需要在vs code中,修改该项目运行的环境。可以手动修改:shift+command+p打开command palette,Python:select interpretor选择该新建的环境作为该项目的运行环境。

    当别人需要复现你的项目的时候,只需将该项目git clone到本地,cd到该项目地址,运行以上同样的命令,就可以新建一个与你在创建该项目时一模一样的环境。

  • setup.py:上面新建了一个环境,下一步要做的自然就是安装包。这里需要说明的是,为了提高效率,我们除了使用已经公开的包之外,还需要使用自己编写的包。

    使用命令:

    python3 -m pip install .

    就可以将所有在'environment.yml'文件中“dependencies”包含的所有包安装,同时,会将路径中通过__init__.py标注的文件安装成可以直接调用的包,(详见下文的“代码”部分,参考之前推送的课件)。

  • 文件夹:上面展示的例子中,存在多个文件夹。'.github/'文件夹存放github ci test的内容,比较复杂,可以参考之前推送的good scientific coding 的课件。如果复杂,也可以暂时跳过,但是ci test是GitHub提供的很酷的功能,后期我们可能会出专门的文章介绍。'docs/'文件夹存放该项目的说明文档和在线网页,是通过sphinx包自动生成的,进一步了解的同样可以参考之前推送的课件。‘mypackage/'和'tests/'见下面的代码部分。

  • 代码:上面的example中,代码被分成了两部分,‘mypackage/'和'tests/',实际上,我建议将代码分成三个部分,’scripts/',‘src/’,‘test/'。以下是一个示例:

code directory
  • ’scripts/'文件夹存放该项目的运行代码,包括分析数据,生成图件等。
  • 'src/'存放自己编写的包(可以调用的函数),这非常重要,是高效编程的基础。这样就不用总是重复编写代码了。
  • 'test/' 存放test文件。如果正确定义了上文提到的ci test 文件,这里存放的文件,可以在每一次在将项目push到GitHub的时候进行运行试错。

要想要自己的代码可以被调用,同时这些代码也可以直接修改,可以参考这个链接 https://pythonchb.github.io/PythonTopics/where_to_put_your_code.html

比如上面例子中,'src/Teleconnection/spatial_pattern.py'中定义了以下函数:

# the loc of this file: 'src/Teleconnection/spatial_pattern.py'
def add(a,b):
  """
  test if the package can be loaded.
  """

  return a+b

这样,在'scripts/'中新建一个文件‘sometask.py',就可以调用'src/'下面的'teleconnection/'中的函数:

# import public pakage
import xarray as xr

# import your own package
import src.Teleconnection.spatial_pattern as ssp

c = ssp.add(a,b)

当然,我们需要经常修改source code,可以通过以下命令重新import 该包,而不用重启:

import importlib
importlib.reload(ssp)

在VS code中使用git

VS code提供了非常友好的git界面。git add 被加号代替,输入message,点击commit,之后点击Sync Changes 即可同步到GitHub,左下角可以新建branch。

VS code git

使用Latex进行保存和展示

Latex可以制作slides。在上文介绍的代码中生成图之后,如果只是扔进一个文件夹里,时间久了也容易忘记做每个图的初衷,最好的办法还是把图放进slides里,这样既有图,也有当时的文字描述。

我们所提供了在线的markdown和latex的软件,我相信国内也有很多替代品。原本markdown简单的语法可以完美满足记录和分享的需求,但是图片的清晰度总是被压缩,所以我转向了Latex。在线的完美之处在于,多平台同步。

Latex制作slides的教程不再展示。下面是一个示例:

左侧的文件夹,可以作为一个在线的文件备份,而且图片不会压缩。下面有多个latex文件将slides分成不同的部分,这可以产生很多妙用,我们后期可能也会出Latex相关的文章。

VS code远程连接超算

VS code 有很多extension,使用python需要安装python扩展,远程连接超算需要安装Remote - SSH 扩展。完成之后左下角会出现绿色标志><,点击之后在窗口中输入通过terminal登陆超算同样的账号和密码。

remote

以下连接Levante步骤可做参考:

For those who want to use vs code (thus git) on Levante:

Connecting vs code with Levante is quite straightforward, using an extension like this linkhere, you will forward to a window, just enter the account for Levante like we do on command line.

Using the default python on Levante, after login the Levante, use the terminal in the bottom, and type module load python3, then which python3 will give you a location for this interpreter. Copy the path. shift+command+p open the Command Palette, and type Python: Select Interpreter and then + Enter interpreter path, paste the path copied before.

Using git on Levante with VS code, click the git coin in the left panel, the vs code will ask you to install git first. Go to the terminal in the bottom, module load git, the vs code can not find the location for git yet. So help it by hand. which git shows the path for git, copy the path. Go to Preference - Settings, click the Remote[SSH:levante.dkrz.de] tab at the top. Search for git.path at the search bar at the top, edit the path to the path copied before. Then go to the git coin again, reload git.

Then the git and python can be used as you use vs code locally on your Mac. Of course you can access the data on Levante. Git push to GitHub is simple, too.

当然,如果不用超算,这一步就不用管。

后记

一个月前,我因为在一个方向上苦苦探索很久没有进展而接着三个多月前的工作继续,但是我发现当时的我已经看不懂之前的我的代码,想法以及图件了。我跟一个中国同事聊天的时候提到这事,她说那是时候让你的工作更加系统化了。以上多少算是相关的一个探索。

现在,每天我面对着三个屏幕,横屏打开‘scripts/'中的工作代码,竖屏打开'src/'中的source code,笔记本屏幕做一些检索之类的工作,像极了认真科研的样子。

让工作变得更高效的是一个不会停止的话题,探索高效可持续的方式是科研这场马拉松的起点。上文只是一些有点杂乱的记录。并不是每一个项目都值得推荐,并不是每个项目都解释地清楚。实际上,我的本意也并不是出一个教程,我一直觉得编程之类的东西,重要的并不是知道怎么做,而是知道可以做什么,在真正需要做的时候,再去搜索怎么做。

往 期 推 荐
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/146482
 
255 次点击