2010-10-04 34 views
30

Tôi đang kéo tóc ra để cố gắng tìm ra điều này vì tôi đã làm việc đó cho đến tuần trước và bằng cách nào đó nó đã bị hỏng.Cách sử dụng virtualenv với Google App Engine SDK trên Mac OS X 10.6

Khi tôi thiết lập virtualenv cho ứng dụng Google App Engine và khởi động ứng dụng với dev_appserver.py, tôi gặp lỗi khi nhập thư viện chuẩn (như "ImportError: No module named base64").

Đây là những gì tôi đang làm:

(Sử dụng hệ thống Python)

virtualenv --python=python2.5 --no-site-packages ~/.virtualenv/foobar

Sau đó, tôi thêm một gae.pth tập tin để ~/.virtualenv/foobar/lib/python2.5/site-packages/ chứa Engine thư viện Google App:

/usr/local/google_appengine 
/usr/local/google_appengine/lib/antlr3 
/usr/local/google_appengine/lib/cacerts 
/usr/local/google_appengine/lib/django 
/usr/local/google_appengine/lib/fancy_urllib 
/usr/local/google_appengine/lib/ipaddr 
/usr/local/google_appengine/lib/webob_1_1_1 
/usr/local/google_appengine/lib/yaml/lib 

(Đó là dựa trên this answer.)

Sau đó, tôi tìm nguồn ảo "foobar" và cố gắng khởi động ứng dụng của mình với dev_appserver.py.

Máy chủ khởi động nhưng lỗi yêu cầu đầu tiên với "ImportError: No module named base64" nói trên. Nếu tôi truy cập vào bảng điều khiển quản trị, tôi nhận được "ImportError: No module named cgi".

Nếu tôi khởi động python, tôi có thể tải các mô-đun này.

>>> import base64 
>>> base64.__file__ 
'/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/base64.py' 

Dường như hộp cát của SDK đang ngăn các thư viện này được tải. Nhưng như tôi đã nói, tôi đã làm việc này cho đến tuần trước ... một cái gì đó thay đổi hoặc tôi vô tình phá vỡ virtualenv của tôi và tôi không thể hiểu làm thế nào tôi đã nhận nó làm việc ở nơi đầu tiên.

phiên bản phần mềm:

Google App Engine SDK 1.3.7
Mac OS X Snow Leopard 10.6.4
virtualenv 1.5.1

Cập nhật: Đáp lại câu hỏi Alan FRANZONI của:

Tôi đang sử dụng hệ thống Python đi kèm với Mac OS X. Tôi đã cài đặt virtualenv qua easy_install. Tôi đã nâng cấp lên virtualenv 1.5.1 hôm nay để cố khắc phục sự cố.

Nếu tôi chạy python /usr/local/bin/dev_appserver.py với virtualenv python, sự cố vẫn tiếp diễn. Nếu tôi tắt virtualenv và chạy lệnh đó với hệ thống python2.5, nó hoạt động. (. Ngoài ra, tôi có thể sử dụng GoogleAppEngineLauncher để bắt đầu ứng dụng của tôi)

Đây là một vết đống đầy đủ (cái này sử dụng khuôn khổ Kay, nhưng vấn đề là như nhau với webapp):

Traceback (most recent call last): 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3206, in _HandleRequest 
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3149, in _Dispatch 
    base_env_dict=env_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 525, in Dispatch 
    base_env_dict=base_env_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2402, in Dispatch 
    self._module_dict) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2312, in ExecuteCGI 
    reset_modules = exec_script(handler_path, cgi_path, hook) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2208, in ExecuteOrImportScript 
    exec module_code in script_module.__dict__ 
    File "/Users/look/myapp/kay/main.py", line 17, in <module> 
    kay.setup() 
    File "/Users/look/myapp/kay/__init__.py", line 122, in setup 
    from google.appengine.ext import db 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module 
    return self.FindAndLoadModule(submodule, fullname, search_path) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule 
    description) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate 
    return func(self, *args, **kwargs) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted 
    description) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/db/__init__.py", line 81, in <module> 
    import base64 
ImportError: No module named base64 
+0

Bạn có thể cắt và dán toàn bộ đầu ra cho lỗi đó không? Nếu bạn sử dụng "python /usr/local/bin/dev_appserver.py" thì lỗi có giữ nguyên không? Ngoài ra, làm thế nào bạn cài đặt virtualenv, thông qua setuptools? Và bạn đang sử dụng hệ thống python2.5, macports một, bất kỳ kết hợp của những người? –

+0

Cảm ơn bạn đã trả lời. Tôi đã cập nhật bài đăng để trả lời câu hỏi của bạn. –

+0

Bạn có thể nhập "con trăn" nào để đảm bảo bạn đang chạy virtualenv Python không? – varikin

Trả lời

15

Đây là một issue 4339 với SDK GAE, nó được xác nhận và có hai bản vá lỗi hơi khác nhau có sẵn trong mục nhập lỗi làm cho nó hoạt động.

Điều gì xảy ra là dev_appserver.py thiết lập môi trường python bị hạn chế bằng cách không cho phép truy cập vào bất kỳ mô-đun phi hệ thống nào và thực hiện điều đó bằng cách tính toán thư mục python hệ thống từ vị trí của mô-đun os. Trong trường hợp virtualenv, os.py được symlinked vào virtualenv nhưng được biên dịch thẳng vào virtualenv và đây là đường dẫn dev_appserver sử dụng, chặn truy cập vào bất kỳ mô-đun nào từ thư viện python hệ thống không được liên kết bởi virtualend. của họ. Giải pháp là "chúc lành" cả hai con đường.

+0

Sự cố 4339 vừa được đóng dưới dạng Cố định cho SDK phiên bản 1.6.1. Tôi đã thử nó và nó hoạt động cho tôi một lần nữa! –

1

tôi nghĩ rằng, vì bạn đã thiết lập virtualenv với tùy chọn --no-site-packages, bạn cần phải cài đặt SDK vào môi trường. --no-site-packages phân tách môi trường dev bạn cấu hình từ bất kỳ cài đặt Python nào khác trên máy tính của bạn, vì bạn dường như đã cấu hình nó, bạn đang gọi một mô-đun không tồn tại (trong môi trường) tại sao nó hoạt động với env ngừng hoạt động (sau đó chạy Python từ cài đặt hệ điều hành mặc định).Hãy thử thiết lập dev env mà không có tùy chọn --no-site-packages nếu bạn muốn có thể truy cập các mô-đun bên ngoài của env.

+0

thông thường có --no-site-packages với virtualenv để tránh ô nhiễm – Lionel

2

Google AppEngine SDK thực hiện rất nhiều mẹo để kéo cài đặt của nó vào sys.path và các thủ thuật này dựa trên đường dẫn của tệp thực. Tôi nghĩ rằng có thể có rất nhiều lý do khác nhau tại sao nó thất bại. SDK không cài đặt chính nó như là một gói python thực, virtualenv không hoàn thành sandboxing, nó chỉ thiết lập một môi trường (rõ ràng) và thay đổi sys.path. Và GAE SDK thực hiện điều này quá, cả hai đều intefere, SDK đang được phát triển nhanh chóng và thay đổi thường xuyên, vì vậy đây là con đường cực kỳ gập ghềnh để đi.

Có thể, sẽ tốt hơn nếu bạn giải thích bạn đang cố gắng đạt được điều gì. Tôi đoán là bạn đang cố tạo môi trường trong sạch để đảm bảo rằng không có mô-đun bên thứ ba nào khả dụng cho ứng dụng. Nếu đoán này là chính xác, tôi sẽ đi với cài đặt GAE SDK vào virtualenv thông qua các tập tin yêu cầu như mô tả here.

0

Câu trả lời tương tự như bozzo. Dưới đây là hướng dẫn:

Điều này được mô tả trong Issue 4339 cho GAE. Dưới đây là cách khắc phục nó:

  1. Tải vá ở đây: patch
  2. Move các bản vá để google_appengine/google/appengine/tools/
  3. Thay đổi thư mục làm việc của mình vào con đường tương tự như trên
  4. Loại: vá -p0 < dev_appserver.patch
1

Tôi hơi muộn để cuộc trò chuyện, nhưng tôi chỉ gặp vấn đề tương tự và tôi tình cờ gặp gae_installer, mà bạn có thể cài đặt theo cách thông thường với pip install gae_installer. Điều này sẽ đặt công cụ ứng dụng google (gae) sdk trực tiếp vào đường dẫn python của bạn. Hy vọng những người khác thấy điều này hữu ích.

+0

bạn đã làm điều này bên trong hay bên ngoài env ảo? – vlsd

Các vấn đề liên quan