Python中的模块/项目结构

时间:2017-07-06 09:21:33

标签: python python-3.x import module structure

我正在尝试用Python构建一个简单的项目,但是,尽管一遍又一遍地阅读文档并阅读示例代码,但我似乎无法理解它是如何完成的。

我是Python的半新手,只有单文件脚本的背景。 但是,我使用多个文件夹和包制作了许多Node.js和Java项目。 在Python中但是我似乎无法掌握项目结构和工作流机制 - init .py,virtualenvs,setuptools等等。这对我来说似乎非常陌生和不直观,损害了我的整体生产力(具有讽刺意味的是Python)应该是一种旨在提高生产力的语言,对吗?)

我的项目有这个示例结构:

package_test  (package)
    |
    |------- __init__.py
    |------- main.py (entry point)
    |
    |------- /lib (modules)
    |           |
    |           |----- __init__.py
    |           |----- lib.py
    |
    |------- /Tests
    |           |
    |           |----- __init__.py
    |           |----- test.py
在main.py中

 from lib import lib

 lib.libtest()
lib.py中的

 def libtest():
     print("libtest")

在test.py中:

 from lib import lib

 lib.libtest()

运行main.py有效,但运行test.py时无法找到该模块。我尝试了一些解决方案,比如附加到sys.path,在lib之前加上'..',而且更多 - 没有用过。

这只是一个例子,但我希望将来在Python中使用多个子文件夹开发更复杂的项目(我认为Python有一些很酷的功能和很好的库),但这个问题一直困扰着我。在使用Java或Node开发时,我从来没有考虑过这些问题,更不用说virtualenv等内容。

先谢谢你

1 个答案:

答案 0 :(得分:0)

你的test.py需要知道lib.py在它上面一层,在lib文件夹里面。所以你需要做的就是在运行lib.py导入到test.py之前附加lib文件夹的路径。像

这样的东西
import sys
sys.path.append("..//lib")
import lib

请注意,上面的答案假定您在Windows上运行。更全面的方法是用适当的os.path语法替换windows路径。此代码的另一个假设是,您将从其文件夹中运行test.py,而不是使用绝对/相对路径。

import sys
import os.path
sys.path.append(os.path.join(os.path.pardir, 'lib'))
import lib

如果您想使用路径运行test.py,您的代码可能如下所示:

import sys
import os.path
# os.path.abspath(__file__) gets the absolute path of the current python scrip
# os.path.dirname gets the absolute path of whatever file you ask it to (minus the filename)
# The line below appends the full path of your lib folder to the current script's path
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.path.pardir, 'lib'))
# This should allow test.py to import libtest regardless of where your run it from. Assuming your provided project structure.
from lib import libtest
libtest()