Django manage.py не может использовать реализацию Python protobuf C++
Я пытаюсь использовать реализацию 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
У меня уже есть libprotobuf.so.8 в /usr/local/lib, так что кажется, что 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)
Обратите внимание, что мне нужно установить PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION и LD_LIBRARY_PATH внутри manage.py, потому что когда я печатаю os.environ внутри manage.py, эти переменные окружения отсутствуют.
Я также попытался скопировать myscript.py в /myapp/app, а затем запустил
/myapp/bin/python /myapp/app/myscript.py
и удивительно, что myscript.py не использует реализацию C++ protobuf. Если я попытался установить переменные окружения в скрипте, это привело к той же ошибке выше.
Есть что-то еще, что я пропускаю? Я думаю, что мне нужно поместить переменные окружения где-нибудь в /myapp/app, но я не могу найти правильный способ сделать это. Большое спасибо.
1 ответ
Я обошел проблему, добавив это в файл manage.py
from ctypes import cdll
cdll.LoadLibrary('/usr/local/lib/libprotobuf.so')
os.environ.setdefault("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "cpp")