如何使用简单的`import`语句在系统范围内使用python函数和类

时间:2016-09-21 16:24:56

标签: python python-3.x python-import

简介

我以为我会尝试制作一个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__

1 个答案:

答案 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之前的隐式相对导入语法。