2012-12-31 5 views
10

का उपयोग कर फ़ाइल के लिए बिट निष्पादित करें मैक ओएस पर पायथन का उपयोग करके, मैं लिखने के लिए एक फ़ाइल खोलना चाहता हूं और इसमें कुछ खोल आदेश देना चाहता हूं। बाद में टर्मिनल में चलाने के लिए।पाइथन

with open("my_script.sh", "w") as fd: 
    fd.write("#!/bin/sh\n") 
    fd.write("echo $PATH\n") 

इस फ़ाइल में पैदा करेगा, लेकिन मैं समझ नहीं सकता कैसे इतने पर अमल बिट सेट करने के लिए जब मैं टर्मिनल में इसे चलाने मैं नहीं मिलेगा:

sh: my_script.sh: Permission denied 
+0

फ़ाइल में उचित अनुमतियां सेट करने के लिए उपप्रोसेसर का उपयोग करें - http://docs.python.org/2/library/subprocess.html – theharshest

+0

@thehesthest: आप 'subprocess' के साथ ऐसा कैसे करेंगे? (मुझे लगता है कि आप 'check_call (['chmod', 'a + x', 'myscript.sh']) 'वैसे ही कर सकते हैं, उसी तरह से आप' check_call (['echo', 'foo'])' ' 'प्रिंट ('foo')' 'यदि आप वास्तव में चाहते हैं, लेकिन ... क्यों?) – abarnert

उत्तर

18
import os 
os.chmod("my_script.sh", 0744) 

मूल्य उठाओ ठीक है हालांकि। कुछ मूल्य सुरक्षित नहीं हो सकते हैं।

+0

यह काम करता है - धन्यवाद। –

+4

आपको पायथन 3 संगतता के लिए '0o744' का उपयोग करने की आवश्यकता है। – asmeurer

10

तुम हमेशा टर्मिनल खोल से ऐसा कर सकते हैं, यह चल रहा है, chmod उपयोग करने से पहले:

chmod a+x my_script.sh 

आप अजगर से यह करने के लिए चाहते हैं, आप os मॉड्यूल में या तो chmod या fchmod उपयोग कर सकते हैं। आप पहले से ही फ़ाइल खोल रखी है, के बाद से, मैं बाद करना चाहते हैं:

with open("my_script.sh", "w") as fd: 
    fd.write("#!/bin/sh\n") 
    fd.write("echo $PATH\n") 
    os.fchmod(fd.fileno(), stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH) 

दुर्भाग्य से, जैसा कि आप देख सकते हैं, वहाँ जबकि बाकी अकेला छोड़ देगा हर किसी के लिए x ध्वज जोड़ने chmod a+x के लिए कोई सीधा बराबर है। लेकिन अगर आप एक ही बात chmod कमांड लाइन उपकरण वास्तव में करता है कर सकते हैं: stat फ़ाइल (इस मामले में या,, fstat) मौजूदा अनुमतियां प्राप्त करने में है, तो उन्हें संशोधित:

with open("my_script.sh", "w") as fd: 
    fd.write("#!/bin/sh\n") 
    fd.write("echo $PATH\n") 
    mode = os.fstat(fd.fileno()).st_mode 
    mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH 
    os.fchmod(fd.fileno(), stat.S_IMODE(mode)) 

(आप नहीं करते वास्तव में S_IMODE अधिकांश प्लेटफार्मों पर कदम की आवश्यकता है, क्योंकि st_mode में कोई अतिरिक्त बिट्स नहीं है, या (एफ) chmod हानिरहित रूप से उन्हें अनदेखा करता है-ओएस एक्स करता है। लेकिन सही कोड करना बेहतर है, अपना कोड पोर्टेबल और भविष्य बनाने के लिए -प्रूफ।)

अधिकांश लोग S_IXUSR जैसे "दोस्ताना" नामों को विशेष रूप से अनुकूल नहीं मानते हैं, और एक बार आप अष्टाधारी मामले में मोड के बारे में सोचना सीखना यह वास्तव में कैसे POSIX बातें abbreviates याद करने की कोशिश कर की तुलना में आसान है, तो आप इस पसंद कर सकते हैं:

with open("my_script.sh", "w") as fd: 
    fd.write("#!/bin/sh\n") 
    fd.write("echo $PATH\n") 
    mode = os.fstat(fd.fileno()).st_mode 
    mode |= 0o111 
    os.fchmod(fd.fileno(), mode & 0o7777) 

111 उपयोगकर्ता, समूह, और अन्य द्वारा निष्पादन का मतलब है (एक ही विभिन्न ST_IX* बिट्स के | की बात), और 7777 उन सभी बिट्स हैं जिन्हें आपको पास करने की अनुमति है (एफ) chmod (वही बात जो S_IMODE करता है)।