一个.py文件就是一个python模块,一个包含__init.py文件的文件夹就是一个python包(包和模块的具体区别这这里)。
如果我们要把自己写好的文件用git进行版本管理,需要用git init命令这包的文件夹内创建一个.git的隐藏文件夹,从此这个包(文件夹)就可以使用git进行版本管理了。而且这个带.git文件夹的包从此也可push到github进行托管了。注意每次git push所操作的单位是整个包,包的根目录需要有.git文件夹。
如果我们写好的包需要发布到pypi上供其他人通过pip 的方式使用怎么办?注意发布我们的包到pypi上和git版本管理是两回事,不需要创建.git隐藏文件夹。而是需要这包的根目录创建一个setup.py,并且用python setup.py sdist bdist_wheel 命令生成一个可供发布的文件在dist文件夹里,然后用twine upload dist/* 推送到pypi网站上(参见:https://packaging.python.org/tutorials/packaging-projects/)。
使用pycharm的用户都会发现pycharm点击file会有新建项目,打开项目等选项。也就是说pycharm是把一些.py文件组合成项目来管理的(比如这同一个项目里可以同意修改文件名,模块名,重构代码,搜索等)。那么之前我们已经有知道__init__.py代表文件夹是一个python包,有.git隐藏文件代表文件夹是git版本库,有setup.py代表文件夹可以将来发布(这里说的不严谨),那么pycharm的项目是以什么为代表的呢?答:pycharm用一个.idea的隐藏文件夹代表这是一个pycharm项目。.idea文件夹存储了事先pycharm各个功能所必须的东西,比如代码回溯,全局搜索,等等 。
关于嵌套
一个python包(本地的或者通过pip在pypi网站下载的)里可以有一个或者多个python包(其实只要每个子文件夹下有个__init__.py文件就行)。
一个python模块里可以有多个函数,类,对象等。
一个git repository库可以包括多个git 库吗?[答案是可以!] (https://stackoverflow.com/questions/17775828/github-include-from-another-repository) 你可能会问,为什么会有这个需求???因为子模块允许您将项目保留在单独的存储库中,但仍可以将它们作为其他存储库的工作目录中的文件夹进行引用。
一个git仓库的一个本地包可以单独被发布到pypi上吗?可以。因为我碰到了这个需求。我之前做一个项目,写了很多本地的包,其实可以发到pip上让我其他相关项目继续用。所以就需要把原来项目内的一个本地包想办法发不到pypi上。
一种方法是我把这个包(文件夹)单独剪切出来,上传到pypi上。但是就需要更改项目中所有导入该包的方式。比如之前在项目中我import project.package1.subpackage.module
。现在我需要pip install subpackage; import subpackage.module.
(更新,不过)
Reference
- https://packaging.python.org/tutorials/packaging-projects
- https://stackoverflow.com/questions/17775828/github-include-from-another-repository
- https://www.vogella.com/tutorials/GitSubmodules/article.html#:~:text=Git%20allows%20you%20to%20include,the%20parent%20repository’s%20working%20directory.