一、常见的结构

       关于如何组织一个较好的Python工程目录结构,已经有一些得到了共识的目录结构。在Stackoverflow的这个问题上,能看到大家对Python目录结构的讨论。

这里面说的已经很好了,我也不打算重新造轮子列举各种不同的方式,这里面我说一下我的理解和体会。

假设你的项目名为foo, 我比较建议的最方便快捷目录结构这样就足够了:

1 Foo/
 2 |-- bin/
 3 |   |-- foo
 4 |
 5 |-- foo/
 6 |   |-- tests/
 7 |   |   |-- __init__.py
 8 |   |   |-- test_main.py
 9 |   |
10 |   |-- __init__.py
11 |   |-- main.py
12 |
13 |-- docs/
14 |   |-- conf.py
15 |   |-- abc.rst
16 |
17 |-- setup.py
18 |-- requirements.txt
19 |-- README

简要解释一下:

  1. bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
  2. foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py
  3. docs/: 存放一些文档。
  4. setup.py: 安装、部署、打包的脚本。
  5. requirements.txt: 存放软件依赖的外部Python包列表。
  6. README: 项目说明文件。

除此之外,有一些方案给出了更加多的内容。比如LICENSE.txt,ChangeLog.txt文件等,我没有列在这里,因为这些东西主要是项目开源的时候需要用到。

二、如何解决多次目录下数据的导入?

        1.比如:main.py中导入docs文件中的conf.py中的函数

                       from docs improt conf         #这样的导入是不成功的

           因为from导入的是该目录即foo文件下的文件夹,docs与foo文件夹是一级的目录导入不成功

       2.解决方案

1 import os,sys
 2  
 3 path = os.path.join(os.path.dirname(os.path.abspath(__file__))) 
 4 #返回脚本的绝对路径
 5 sys.path.append(path)
 6 #临时添加搜索路径,这种方法导入的路径会在python程序退出后失效。
 7  
 8  
 9  
10 #path1=os.path.abspath(__file__)
11 #print(path1)#当前文件的绝对路径
12  
13 #path2=os.path.dirname(os.path.abspath(__file__))
14 #print(path2)#当前文件的上一层目录的绝对路径
15  
16 #path3=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17 #print(path3)#当前文件的上上层目录的绝对路径
18  
19 #os.path.join()函数用于路径拼接文件路径