如何在python3.6中导入python3 lib

时间:2017-07-10 12:50:53

标签: python linux

我为python 3.6创建了虚拟环境。我已安装python3-pyqt5.qtwebkitapt-get。该软件包已安装在全局python3.5及其工作,但如果我尝试从venv python3.6导入它有导入错误...如何在我的虚拟环境中安装此软件包?或者,如果这不可能,我怎么能在我的virtualenv 3.6 python中使用3.5中安装的全局包。

使用全局python3.5

运行
(virtualenv) 
~/vcs-ss/sst  master ✗                                                                                                                         5d ▴ ⚑ ✚ ◒  
▶ python3.5 -c 'import PyQt5.QtWebKit; print(PyQt5.QtWebKit.__file__)'
/usr/lib/python3/dist-packages/PyQt5/QtWebKit.cpython-35m-x86_64-linux-gnu.so

从venv

运行python3.6
(virtualenv) 
~/vcs-ss/sst  master ✗                                                                                                                         5d ▴ ⚑ ✚ ◒  
▶ python3.6 test/e2e/browser.py     
Traceback (most recent call last):
  File "test/e2e/browser.py", line 8, in <module>
    from PyQt5.QtWebKit import *
ModuleNotFoundError: No module named 'PyQt5.QtWebKit'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "test/e2e/browser.py", line 8, in <module>
    from PyQt5.QtWebKit import *
ModuleNotFoundError: No module named 'PyQt5.QtWebKit'

2 个答案:

答案 0 :(得分:0)

要在虚拟环境中使用系统包,在创建虚拟环境时必须使用--system-site-packages选项:

virtualenv --python=python3.6 --system-site-packages env

Python3&#39; venv中提供了相同的开关。

使用pip在您的虚拟环境中安装所有软件包(如果适用)是更好的选择。

答案 1 :(得分:0)

如果您查看包的内容(使用dpkg --listfiles python3-pyqt5.qtwebkit),您可能会看到类似这样的内容:

/.
/usr
/usr/lib
/usr/lib/python3
/usr/lib/python3/dist-packages
/usr/lib/python3/dist-packages/PyQt5
/usr/lib/python3/dist-packages/PyQt5/QtWebKit.cpython-35m-x86_64-linux-gnu.so
/usr/lib/python3/dist-packages/PyQt5/QtWebKit.pyi
/usr/lib/python3/dist-packages/PyQt5/QtWebKitWidgets.cpython-35m-x86_64-linux-gnu.so
/usr/lib/python3/dist-packages/PyQt5/QtWebKitWidgets.pyi
/usr/share
/usr/share/doc
/usr/share/doc/python3-pyqt5.qtwebkit
/usr/share/doc/python3-pyqt5.qtwebkit/copyright
/usr/share/doc/python3-pyqt5.qtwebkit/changelog.Debian.gz

该软件包安装为特定python版本编译的二进制模块(在本例中为:cpython-35m),由于二进制名称不兼容,您将无法直接使用python3.6 installation / venv中的那些模块。 / p>

要实现这一点,您需要将.so目录中的所有PyQt5文件符号链接到您的venv,并将cpython-35m-x86_64-linux-gnu更改为cpython-36m-x86_64-linux-gnu。对于sip库也是如此,因为PyQt5需要这些库。只有ABI在两个版本之间兼容时,这才有效。

使用上述版本进行快速测试表明它至少适用于简单的脚本,但我无法保证。