我以为我会尝试制作一个python模块,让我的一些库和函数在系统范围内可用。 Google和StackExchange提供了充足的“解决方案”和操作方法。但由于某些原因,它们似乎都不适合我。显然,我做错了什么。但经过几天的试验和错误我已经决定向你们展示我拥有的东西并让你向我指出明显的错误;-)非常感谢你的帮助。
我的GitHub项目目录包含此树:
shouldn't apply inside a process substitution anyway, since
$ tree /tmp/mausy5043-common-python
/tmp/mausy5043-common-python
├── docs
├── gitforcepull
├── LICENSE
├── mausy5043funcs
│ └── __init__.py
├── mausy5043libs
│ ├── __init__.py
│ ├── libdaemon3.py
│ └── libsmart3.py
├── README.md
├── setup.py
└── tests
是一个提供libsmart3.py
的python脚本。两个class SmartDisk():
脚本都是空的。 __init__.py
是包含另一个类的脚本。它有同样的问题,但我会在这里以libdaemon3.py
模块为例。
我按如下方式安装此项目:
libsmart3
现在我想在另一个python脚本中使用这个类$ sudo python3 setup.py install
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/mausy5043libs
copying mausy5043libs/libdaemon3.py -> build/lib/mausy5043libs
copying mausy5043libs/libsmart3.py -> build/lib/mausy5043libs
running install_lib
copying build/lib/mausy5043libs/libsmart3.py -> /usr/local/lib/python3.4/dist-packages/mausy5043libs
copying build/lib/mausy5043libs/libdaemon3.py -> /usr/local/lib/python3.4/dist-packages/mausy5043libs
byte-compiling /usr/local/lib/python3.4/dist-packages/mausy5043libs/libsmart3.py to libsmart3.cpython-34.pyc
byte-compiling /usr/local/lib/python3.4/dist-packages/mausy5043libs/libdaemon3.py to libdaemon3.cpython-34.pyc
running install_egg_info
Removing /usr/local/lib/python3.4/dist-packages/mausy5043_common_python-0.1dev.egg-info
Writing /usr/local/lib/python3.4/dist-packages/mausy5043_common_python-0.1dev.egg-info
。要做到这一点,我期望(希望)我能够直接导入该类 - 感谢SmartDisk()
的存在 - 因此:
__init__py
或
$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from mausy5043libs import SmartDisk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'SmartDisk'
>>>
的作用是:
>>> from libsmart3 import SmartDisk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'libsmart3'
>>>
但这不是广告的方式(参考:http://mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html)
我尝试在>>> from mausy5043libs.libsmart3 import SmartDisk
中添加import libsmart3
。不起作用。
我在mausy5043libs/__init__.py
中添加了from libsmart3 import SmartDisk
。没有快乐。
我假设python需要这个,我在项目根目录中添加了一个空的mausy5043libs/__init__py
。没有帮助。
修改 所做的更改:按{user2357112
的建议设置为__init__.py
mausy5043libs/__init__py
编辑2 :事实证明@ user2357112 提供的解决方案确实有效。显然,我的疏忽很小。在$ cat mausy5043libs/__init__.py
from .libsmart3 import SmartDisk
$ sudo python3 setup.py install
[... output removed ...]
$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from mausy5043libs import SmartDisk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'SmartDisk'
setup.py
列表中缺少条目mausy5043libs/__init__
。
答案 0 :(得分:1)
你完全误读了你正在使用的来源。如果您希望能够直接从SmartDisk
包导入mausy5043libs
,则mausy5043libs/__init__.py
需要导入SmartDisk
:
# in mausy5043libs/__init__.py
from .libsmart3 import SmartDisk
然后包的用户可以按照你想要的方式导入它:
# in code that wants to use SmartDisk
from mausy5043libs import SmartDisk
您链接的文章在“__init__.py
中的内容”下包含此信息,尽管它们使用了Python 3之前的隐式相对导入语法。