目前有一个项目,下面有两个子项目01和02。这两个项目要共享一部分代码,因此我把共用的代码抽出来写成一个包。整个项目的目录结构像是这样的
/my_proj
/sub_proj01
proj_file01.py
/sub_proj02
proj_file02.py
/my_package
__init__.py
module01.py
module02.py
我如何在proj_file01.py
和proj_file02.py
中通过类似
import my_package.module01
from my_package.module02 import *
来引用module01.py
和module02.py
里面的功能呢?往sys.path
里面加路径?,感觉不太对啊。而且my_package
也在开发中,所以不能把它分离出来放到python的default path里面。
有其他更合理的方案吗?谢谢大家了。
2
9hills 2015-02-10 17:44:48 +08:00
设置环境变量 PYTHONPATH
如果因为不想全局应用,可以试试这个东西 https://github.com/kennethreitz/autoenv 对某个dir单独设置env,cd进去的时候自动应用。。 |
3
rikeinei 2015-02-10 18:06:38 +08:00
import ..my_package.module01
|
4
KyL OP @rikeinei 我试了试,报错。ValueError: Attempted relative import in non-package
|
5
tabris17 2015-02-10 18:21:13 +08:00
setuptools
|
6
endoffight 2015-02-10 18:28:26 +08:00 via Android
可以通过拓展sys.path,将包的路径加入即可!
|
7
invite 2015-02-10 18:58:06 +08:00
site-packages 下面放个 .pth 文件好像可以。
|
8
kaneg 2015-02-10 20:10:32 +08:00 via iPhone
如果用pycharm,直接把各个项目根目录设置为source即可
|
9
binux 2015-02-10 20:17:48 +08:00 1
你这样组织目录是不对的,你只是把 sub_proj01 放到了 my_proj 目录下面,而不是 my_proj.sub_proj01
sub_proj01 和 my_package 没有任何关联 如果你不想 install my_package 到 site-package 的话,你需要将 my_proj 变成模块,然后 sub_proj01 就能用 import my_proj.my_package 了 |
10
ryanking8215 2015-02-10 21:25:32 +08:00
使用相对导入:
例如是proj_file01.py文件,则from .. import mypackage or from ..mypackage import module01,看你需要了。 相对导入有缺点,if __name__=='__main__': 不支持相对导入;执行需要通过python -m xxx, 而且要在合适的目录下,否则会报找不到‘top level'的package. |
12
KyL OP @ryanking8215 请问相对导入PY2中有这个功能吗?我得到错误: from .. import pkgs
ValueError: Attempted relative import in non-package |
13
Sylv 2015-02-11 13:33:29 +08:00 via iPhone
应该是你要先把你的项目变成 package,在目录里加入 __init__.py 文件
|
14
rikeinei 2015-02-13 12:17:41 +08:00
@KyL
Python 的模块包,如果是放在文件夹中,则需要在目录里加入 __init__.py 文件 如果只是一个文件,import sys sys.path.append(文件的绝对路径) 当前强烈不推荐下面的。 |