【问题标题】:Django manage.py unable to use Python protobuf C++ implementationDjango manage.py 无法使用 Python protobuf C++ 实现
【发布时间】:2016-10-23 14:03:04
【问题描述】:

我正在尝试使用 Python protobuf C++ 实现,并且能够从命令行使用它。

export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp 
export LD_LIBRARY_PATH=/usr/local/lib/
/myapp/bin/python myscript.py

但是当我尝试使用 Django manage.py

/myapp/bin/python /myapp/app/manage.py myscript

我明白了

    Traceback (most recent call last):
  File "/myapp/app/manage.py", line 25, in <module>
    __import__('mymodule.scripts.' + script, fromlist=['mymodule.scripts']).main()
  File "/myapp/app/mymodule/scripts/myscript.py", line 4, in <module>
    import mycompany.protobuf.data_pb2 as pb
  File "/myapp/src/mycompany-protobuf/mycompany/protobuf/data_pb2.py", line 3, in <module>
    from google.protobuf import descriptor
  File "/myapp/lib/python2.7/site-packages/google/protobuf/descriptor.py", line 45, in <module>
    from google.protobuf.internal import cpp_message
  File "/myapp/lib/python2.7/site-packages/google/protobuf/internal/cpp_message.py", line 39, in <module>
    from google.protobuf.internal import _net_proto2___python
ImportError: libprotobuf.so.8: cannot open shared object file: No such file or directory

我已经在 /usr/local/lib 中有 libprotobuf.so.8,所以好像 manage.py 无法访问那里的文件?

这就是我的 manage.py 的样子:

#!/usr/bin/env python
import os
import sys

SCRIPTS = [
    'myscript'
]

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mymodule.settings")
    os.environ.setdefault("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "cpp")
    os.environ.setdefault("LD_LIBRARY_PATH", "/usr/local/lib/")

    if len(sys.argv) >= 2 and sys.argv[1] in SCRIPTS:
        import mymodule.settings as settings

        sys.argv.pop(0)
        script = sys.argv[0]
        __import__('mymodule.scripts.' + script, fromlist=['mymodule.scripts']).main()
    else:
        from django.core.management import execute_from_command_line
        execute_from_command_line(sys.argv)

请注意,我必须在 manage.py 中设置 PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION 和 LD_LIBRARY_PATH,因为当我在 manage.py 中打印出 os.environ 时,这些环境变量不存在。

我也尝试将 myscript.py 复制到 /myapp/app 中,然后运行

/myapp/bin/python /myapp/app/myscript.py

令人惊讶的是 myscript.py 没有使用 C++ protobuf 实现。如果我尝试在脚本中设置环境变量,则会导致上述相同的错误。

我还有什么遗漏的吗?我想我需要将环境变量放在 /myapp/app 中的某个位置,但找不到正确的方法。非常感谢。

【问题讨论】:

    标签: python django protocol-buffers manage.py


    【解决方案1】:

    我通过将其添加到我的 manage.py 中解决了这个问题

    from ctypes import cdll
    cdll.LoadLibrary('/usr/local/lib/libprotobuf.so')
    os.environ.setdefault("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "cpp")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 2012-05-27
      • 2015-12-08
      • 2018-06-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多