سؤال

أنا معتاد على حليقة في PHP ولكني أستخدمه لأول مرة في بيثون مع pycurl.

أظل الحصول على الخطأ:

Exception Type:     error
Exception Value:    (2, '')

ليس لدي أي فكرة عما يمكن أن يعني هذا. هنا هو رمزي:

data = {'cmd': '_notify-synch',
        'tx': str(request.GET.get('tx')),
        'at': paypal_pdt_test
        }

post = urllib.urlencode(data)

b = StringIO.StringIO()

ch = pycurl.Curl()
ch.setopt(pycurl.URL, 'https://www.sandbox.paypal.com/cgi-bin/webscr')
ch.setopt(pycurl.POST, 1)
ch.setopt(pycurl.POSTFIELDS, post)
ch.setopt(pycurl.WRITEFUNCTION, b.write)
ch.perform()
ch.close()

الخطأ يشير إلى الخط ch.setopt(pycurl.POSTFIELDS, post)

هل كانت مفيدة؟

المحلول

يبدو أن تثبيت Pycurl الخاص بك (أو مكتبة حليقة) تالفة بطريقة أو بأخرى. من وثائق رموز خطأ حليقة:

CURLE_FAILED_INIT (2)
Very early initialization code failed. This is likely to be an internal error or problem.

ربما تحتاج إلى إعادة تثبيت أو إعادة ترجمة حليقة أو pycurl.

ومع ذلك، للقيام بطلب وظيفة بسيطة كما تفعل، يمكنك في الواقع استخدام Python "Urllib" بدلا من حليقة:

import urllib

postdata = urllib.urlencode(data)

resp = urllib.urlopen('https://www.sandbox.paypal.com/cgi-bin/webscr', data=postdata)

# resp is a file-like object, which means you can iterate it,
# or read the whole thing into a string
output = resp.read()

# resp.code returns the HTTP response code
print resp.code # 200

# resp has other useful data, .info() returns a httplib.HTTPMessage
http_message = resp.info()
print http_message['content-length']  # '1536' or the like
print http_message.type  # 'text/html' or the like
print http_message.typeheader # 'text/html; charset=UTF-8' or the like


# Make sure to close
resp.close()

لفتح https:// عنوان URL، قد تحتاج إلى تثبيت Pyopenssl:http://pypi.python.org/pypi/pyopenssl.

تشمل بعض الاختبارات هذا، والبعض الآخر يوفرها كحزمة إضافية مباشرة من خلال مدير الحزمة المفضلة لديك.


تعديل: هل اتصلت pycurl.global_init () بعد؟ ما زلت أوصي Urllib / Urllib2 حيثما أمكن ذلك، حيث سيتم نقل البرنامج النصي بسهولة أكبر إلى أنظمة أخرى.

نصائح أخرى

أنا أحب ذلك:

post_params = [
    ('ASYNCPOST',True),
    ('PREVIOUSPAGE','yahoo.com'),
    ('EVENTID',5),
]
resp_data = urllib.urlencode(post_params)
mycurl.setopt(pycurl.POSTFIELDS, resp_data)
mycurl.setopt(pycurl.POST, 1)
...
mycurl.perform()

أعلم أن هذا منصب قديم لكنني قضيت صباحي في محاولة لتعقب هذا الخطأ نفسه. اتضح أن هناك خطأ في pycurl التي كانت ثابت في 7.16.2.1. تسبب ذلك setopt () لكسر آلات 64 بت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top