我是一个python 模块制作新手。遵循this question的精神,我安装了Rx来验证来自YAML文件的一些数据。为了让整个聚会保持在一起,我只需将整个git树放在site-packages
下。这为site-packages/Rx/python/Rx.py
的python实现提供了一个(非常简化的)树。
由于无法直接导入,我将__init__.py
添加到site-packages/Rx
,只需一行:
from Rx.python.Rx import *
由于仍然无法直接导入,我将__init__.py
添加到site-packages/Rx/python
,只需一行:
from Rx import *
现在,我可以成功导入。这很好,但我不关心以下
>>> import Rx
>>> a = Rx.Factory()
>>> a
<Rx.python.Rx.Factory object at 0x00C0CCF0>
我希望包名Rx
引用对象,例如<Rx.Factory object at 0x00C0CCF0>
。
这是如何正确完成的?谢谢!
对于可能遇到同样问题的人来说,编辑:
我清空了site-packages/Rx/python/__init__.py
,并更改了site-packages/Rx/__init__.py
,如下所示:
import os
__path__.append( os.path.join(__path__[0], 'python') )
from Rx import *
这不是我想要的,但至少现在对象是Rx.Rx.Factory
等。
答案 0 :(得分:1)
一种常见的模式是按如下方式设置项目:
ProjectName/
|-- bin/
| `-- myscript
|-- package_name/
| |-- __init__.py
| |-- rx.py
`-- setup.py
您的设置脚本如下所示:
#!/usr/bin/env python
from distutils.core import setup
setup(name='ProjectName',
version='1.0',
description='My project description',
author='Me',
author_email='Me@localhost',
url='http://localhost/',
packages=['package_name'],
)
当你跑步时:
$ python setup.py install
Distutils会将您的包目录复制到site-packages中。
使用上述结构,您的导入将如下所示:
from package_name import Rx
print Rx.Factory
你想要的是:
import package_name
print package_name.Factory
为此,您需要将以下内容添加到 init .py:
from rx import Factory
对于开发,您可以象征性地将您的包目录链接到site-packages,但是还有很多其他方法可以在没有符号链接的情况下将开发代码添加到PYTHONPATH。
最简单的方法是简单地将目录更改为项目目录(基于上面的示例cd projectName),然后从那里执行脚本。
如果您不喜欢,可以通过以下方式将开发包附加到您的PYTHONPATH:
$ export PYTHONPATH=$PYTHONPATH:/home/me/ProjectName
另一种方法是使用* .pth文件将您的开发包添加到站点包中,并使其仍然存在于您的主目录中。要做到这一点,你只需创建一个名为myproject.pth的简单文件,其中包括:
# pth file for Rx development
/home/me/ProjectName
关于pth文件的好处是你可以移动你的代码,重命名包,添加第二个包等,它仍然是可导入的,而不用你的符号链接。
当然还有其他选项,比如用户启动文件中的sys.path操作,virtualenv,buildout等工具。
答案 1 :(得分:0)
如果顶级Rx / python目录中没有代码,您可以删除它们并将Rx.py文件放入site-packages。
如果要将整个git树保持在一起,可以将Rx文件从某个地方符号链接到site-packages,但最好修改PYTHONPATH变量以包含具有Rx.py的目录。
Modules上的Python文档非常全面。请务必查看the module search path上的部分。