【问题标题】:OpenCV and python/virtualenv?OpenCV 和 python/virtualenv?
【发布时间】:2012-10-30 00:18:37
【问题描述】:

我正在开发一个使用 OpenCV (2.3.1) 以及其他库的 python 项目。到目前为止,我只是 apt-get 安装了所有东西,但现在我想与可能尚未安装所有东西的人分享我的代码。所以,virtualenv 似乎是完美的解决方案,但我明白了。

$ python src/importcv.py # does nothing but import cv, no problems
$ virtualenv .           # create virtualenv here
$ source bin/activate    # activates this virtualenv
(p)$ python src/importcv.py
Traceback (most recent call last):
  File "src/test.py", line 1, in <module>
    import cv
ImportError: No module named cv

我设置 virtualenv 的方式有问题吗,还是我必须执行其他步骤才能看到我的 opencv python 绑定?

【问题讨论】:

    标签: python linux opencv virtualenv


    【解决方案1】:

    Virtualenv 创建一个单独的 python 环境。您将需要重新安装所有依赖项。编辑这是真的 pip 似乎不能很好地与 opencv 一起使用。可以通过将 cv 共享对象复制到您的 virtualenv 来解决缺少的模块错误。下面链接的问题中的更多信息。

    【讨论】:

    • 这就是我害怕的。它不像 pip 安装是 openCV 用户的流行路线,请参阅这个未回答的问题:stackoverflow.com/q/11184847/34910
    • 我已经为您提到的那个问题添加了一个潜在的解决方案。基本上,将 opencv 安装产生的共享对象复制到我的虚拟环境中,似乎可以解决问题。
    【解决方案2】:

    我在我的项目中使用 makefile 在 Python virtualenv 中安装 OpenCV。下面是样板示例。它要求您已经为您的系统 Python (/usr/bin/python) 提供了 OpenCV 绑定,您可以使用 yum install opencv-pythonapt-get install python-opencv 之类的东西来获取这些绑定。

    首先查询系统 Python 的 cv2 模块并检索已安装库文件的位置。然后它将cv2.so 复制到virtualenv 目录中。

    VENV_LIB = venv/lib/python2.7
    VENV_CV2 = $(VENV_LIB)/cv2.so
    
    # Find cv2 library for the global Python installation.
    GLOBAL_CV2 := $(shell /usr/bin/python -c 'import cv2, inspect; print(inspect.getfile(cv2))')
    
    # Link global cv2 library file inside the virtual environment.
    $(VENV_CV2): $(GLOBAL_CV2) venv
        cp $(GLOBAL_CV2) $@
    
    venv: requirements.txt
        test -d venv || virtualenv venv
        . venv/bin/activate && pip install -r requirements.txt
    
    test: $(VENV_CV2)
        . venv/bin/activate && python -c 'import cv2; print(cv2)'
    
    clean:
        rm -rf venv
    

    (您可以将上面的 sn-p 复制粘贴到 Makefile 中,但请确保通过运行 sed -i s:' ':'\t':g Makefile 或类似的方法将缩进替换为制表符。)

    现在您可以运行模板了:

    echo "numpy==1.9.1" > requirements.txt
    make
    make test
    

    请注意,我们实际上是复制 .so 文件,而不是符号链接,以避免出现此处提到的问题:https://stackoverflow.com/a/19138136/1510289

    【讨论】:

    • 当python可以直接给你路径时,为什么要使用awksed来提取库路径,例如print(cv2.__file__)?还是even better with inspect?
    • 谢谢@leosh,你说得对,比awksed 干净得多。我对我的答案进行了适当的更改。
    【解决方案3】:

    只需将cv2*.so 文件复制到虚拟环境的site-packages 文件夹即可。例如:

    cp /usr/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so ~/your_virt_env_folder/YOUR_VIRT_ENV_NAME/lib/python3.6/site-packages/
    

    【讨论】:

      【解决方案4】:

      如果您想要更便携的解决方案(没有硬编码路径,输出字符串上没有 awk),您可以使用以下 shell sn-p(激活 venv 后):

      echo "Importing opencv library from host into venv..."
      # Find cv2 library for the global Python installation.
      GLOBAL_CV2=$(/usr/bin/python3 -c 'import cv2; print(cv2.__file__)')
      # Find site-packages directory in the venv
      VENV_SITEPACKAGES_DIR=$(python3 -c 'import site; print(site.getsitepackages()[0])')
      # Copy host-installed library file into venv
      cp ${GLOBAL_CV2} ${VENV_SITEPACKAGES_DIR}
      

      【讨论】:

        【解决方案5】:

        尝试在您的venv 中安装opencv-python,以上应该可以工作:

        pip install opencv-python

        【讨论】:

          猜你喜欢
          • 2012-06-26
          • 2016-09-05
          • 2023-03-28
          • 2018-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-24
          • 1970-01-01
          相关资源
          最近更新 更多