您可以将父目录添加到PYTHONPATH
中,为此,您可以在“模块搜索路径”中使用依赖于操作系统的路径(列在sys.path
中)。因此,您可以像下面这样轻松地添加父目录:
import sys
sys.path.insert(0, '..')
from instance import config
请注意,前面的代码使用了相对路径,因此您必须在同一位置内启动该文件,否则可能无法正常工作。要从任何地方启动,可以使用pathlib
模块。
from pathlib import Path
import sys
path = str(Path(Path(__file__).parent.absolute()).parent.absolute())
sys.path.insert(0, path)
from instance import config
然而,以前的方法更像是一种hack,为了做正确的事情,您首先需要按照这篇非常详细的博客文章python packaging重塑项目结构,采用src
文件夹的推荐方式。
project
├── CHANGELOG.rst
├── README.rst
├── requirements.txt
├── setup.py
├── src
│ ├── api
│ │ ├── api.py
│ │ └── __init__.py
│ ├── instance
│ │ ├── config.py
│ │ └── __init__.py
│ └── package
│ ├── app.py
│ └── __init__.py
└── tests
└── __init__.py
请注意,您实际上不需要 requirements.txt
,因为您可以在 setup.py
中声明依赖项。
这是一个示例 setup.py
(改编自 这里):
from __future__ import absolute_import
from __future__ import print_function
import io
import re
from glob import glob
from os.path import basename
from os.path import dirname
from os.path import join
from os.path import splitext
from setuptools import find_packages
from setuptools import setup
def read(*names, **kwargs):
with io.open(
join(dirname(__file__), *names),
encoding=kwargs.get('encoding', 'utf8')
) as fh:
return fh.read()
setup(
name='nameless',
version='1.644.11',
license='BSD-2-Clause',
description='An example package. Generated with cookiecutter-pylibrary.',
author='mpr',
author_email='contact@ionelmc.ro',
packages=find_packages('src'),
package_dir={'': 'src'},
include_package_data=True,
zip_safe=False,
classifiers=[
'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Operating System :: Unix',
'Operating System :: POSIX',
'Operating System :: Microsoft :: Windows',
'Programming Language :: Python',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: Implementation :: CPython',
'Programming Language :: Python :: Implementation :: PyPy',
'Topic :: Utilities',
],
keywords=[
],
python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
install_requires=[
],
extras_require={
},
setup_requires=[
],
entry_points={
'console_scripts': [
'api = api.api:main',
]
},
)
我的api.py
文件的内容:
from instance import config
def main():
print("imported")
config.config()
我的 config.py
文件的内容:
def config():
print("config imported successfully")
你可以在此处找到所有之前的内容
- 可选但建议:创建一个虚拟环境,我使用
venv
(对于Python 3.3 <=),在项目的根目录中:
python -m venv .
并激活:
source bin/activate
在项目根目录下使用pip install -e .
(注意有点号)命令来进行安装。
from instance import config
的导入现在已经可以工作了,您可以通过运行api.py文件来确认:
python src/api/api.py