如何在 python 项目中引用自己的一个包

2015-02-10 17:39:48 +08:00
 KyL

目前有一个项目,下面有两个子项目01和02。这两个项目要共享一部分代码,因此我把共用的代码抽出来写成一个包。整个项目的目录结构像是这样的

/my_proj
    /sub_proj01
        proj_file01.py
    /sub_proj02
        proj_file02.py
    /my_package
        __init__.py
        module01.py
        module02.py

我如何在proj_file01.pyproj_file02.py中通过类似

import my_package.module01
from my_package.module02 import *

来引用module01.pymodule02.py里面的功能呢?往sys.path里面加路径?,感觉不太对啊。而且my_package也在开发中,所以不能把它分离出来放到python的default path里面。
有其他更合理的方案吗?谢谢大家了。

16086 次点击
所在节点    Python
15 条回复
lianghui
2015-02-10 17:43:14 +08:00
为项目建立setup文件, 然后 python setup.py develop 就是使用开发模式安装到本路径。
9hills
2015-02-10 17:44:48 +08:00
设置环境变量 PYTHONPATH

如果因为不想全局应用,可以试试这个东西
https://github.com/kennethreitz/autoenv

对某个dir单独设置env,cd进去的时候自动应用。。
rikeinei
2015-02-10 18:06:38 +08:00
import ..my_package.module01
KyL
2015-02-10 18:18:39 +08:00
@rikeinei 我试了试,报错。ValueError: Attempted relative import in non-package
tabris17
2015-02-10 18:21:13 +08:00
setuptools
endoffight
2015-02-10 18:28:26 +08:00
可以通过拓展sys.path,将包的路径加入即可!
invite
2015-02-10 18:58:06 +08:00
site-packages 下面放个 .pth 文件好像可以。
kaneg
2015-02-10 20:10:32 +08:00
如果用pycharm,直接把各个项目根目录设置为source即可
binux
2015-02-10 20:17:48 +08:00
你这样组织目录是不对的,你只是把 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 了
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.
ligyxy
2015-02-11 03:00:05 +08:00
@kaneg 愿闻其详
KyL
2015-02-11 12:52:06 +08:00
@ryanking8215 请问相对导入PY2中有这个功能吗?我得到错误: from .. import pkgs
ValueError: Attempted relative import in non-package
Sylv
2015-02-11 13:33:29 +08:00
应该是你要先把你的项目变成 package,在目录里加入 __init__.py 文件
rikeinei
2015-02-13 12:17:41 +08:00
@KyL
Python 的模块包,如果是放在文件夹中,则需要在目录里加入 __init__.py 文件
如果只是一个文件,import sys sys.path.append(文件的绝对路径)
当前强烈不推荐下面的。
kaneg
2015-02-14 20:09:09 +08:00
@ligyxy 你用下pycharm就知道了,在需要设置为项目代码根目录的目录上点右键,里面有设置为source的选项,这样运行的时候这个目录就自动加入到path了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/169897

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX