我的团队在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和其他工具无法理解它并提供完成。
有没有更简洁的方法呢?
编辑: 所有的项目和工具都是非常多的工作,经常修改,所以我正在寻找尽可能灵活和舒适的东西
答案 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
答案 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.py
和project2.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
,这也可以提高可读性。