项目目录的Python文件夹结构,易于导入

时间:2018-06-12 06:36:39

标签: python python-3.x import pycharm directory-structure

我的团队在python3中有一个包含几个小项目的文件夹。其中,我们有一个具有多个实用程序功能的实用程序文件夹,在整个项目中使用。但是导入它的方式非常不舒服。这是我们使用的结构:

temp_projects
    util
        storage.py
        geometry.py
    project1
        project1.py
    project2
        project2.py

问题是项目中的导入看起来很糟糕:

sys.path.insert(1, os.path.join(sys.path[0], '..'))
import util.geometry

util.geometry.rotate_coordinates(....)

此外,pycharm和其他工具无法理解它并提供完成。

有没有更简洁的方法呢?

编辑: 所有的项目和工具都是非常多的工作,经常修改,所以我正在寻找尽可能灵活和舒适的东西

6 个答案:

答案 0 :(得分:2)

PYTHONPATH环境变量可能是一种解决方法。只需将其设置为项目文件夹位置:

PYTHONPATH=/somepath/temp_projects

,您将可以按以下方式使用util

import util.geometry

util.geometry.rotate_coordinates(....)

PyCharm也会自动识别。

答案 1 :(得分:0)

我认为正确的路线将与您现在所做的完全不同。每个项目应存储在不同的Git存储库中,共享模块应添加为git submodules。一旦这些项目变得更大,更复杂(并且可能会),分别管理它们就会变得更加容易。

简而言之

项目结构应为:

Project_1
  |- utils <submodule>
       |- storage.py
       |- geometry.py
  |- main.py

Project_2
  |- utils <submodule>
       |- storage.py
       |- geometry.py
  |- main.py

使用子模块

### Adding a submodule to an existing git directory
git submodule add <git@github ...> <optional path/to/submodule>

### Pulling latest version from master branch for all submodules
git submodule update --recursive --remote

### Removing submodule from project
# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the project's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

进一步阅读https://git-scm.com/book/en/v2/Git-Tools-Submodules

答案 2 :(得分:0)

使用importlib。

import importlib, importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

geometry = module_from_file("geometry", "../temp_projects/utils/geometry.py")

geometry.rotate_coordinates(...)

答案 3 :(得分:0)

其他选项(我在项目中使用了此方法)

让我们假设相应地从project1.pyproject2.py文件运行了项目。

在这些文件的顶部,您可以添加以下导入和操作:

import sys
import os

sys.path.append(os.path.join(os.getcwd(), os.pardir))

import your_other_modules

your_other_modules.py将包含以下用于灌输utils的

from utils import storage
from utils import geometry
# or from project2 import project2, etc..

可能不是最好的方法,但是就像另一个选择。我希望这对某人有帮助。

答案 4 :(得分:0)

如果您为setup.py模块创建了util文件,则只需使用pip即可安装它。它将为您处理所有事情。安装后,您可以将其导入整个系统。

import util

点安装

# setup.py is in current folder
sudo -H pip3 install .

,或者如果util模块本身仍在开发中,则可以使用-e可编辑选项进行安装。然后,当您更改代码时,它将自动更新安装。

sudo -H pip3 install -e .

对于项目管理,我建议使用git作为@Michael liv。建议,尤其是在团队中工作。

答案 5 :(得分:0)

根据Importing files from different folder在util文件夹中添加Hostname将使python将其视为软件包。您可以做的另一件事是使用Sessions,然后可以使用__init__.py,这也可以提高可读性。