2012-10-09 8 views
79

मैं एक पायथन स्क्रिप्ट के भीतर से एक फ़ाइल बनाना चाहता हूं जो निष्पादन योग्य है।आप पाइथन के भीतर से एक सरल "chmod + x" कैसे करते हैं?

import os 
import stat 
os.chmod('somefile', stat.S_IEXEC) 

यह os.chmod रास्ता यूनिक्स chmod नहीं 'जोड़ें' अनुमतियाँ करता प्रतीत होता है। आखिरी पंक्ति के साथ टिप्पणी की गई, फ़ाइल में 0mफ़ाइल फ़ाइल है, इसके साथ टिप्पणी नहीं की गई है, फ़ाइल मोड ---x------ है। शेष मोड को बरकरार रखने के दौरान मैं u+x ध्वज कैसे जोड़ सकता हूं?

उत्तर

133

वर्तमान अनुमतियों को प्राप्त करने के लिए os.stat() का उपयोग करें, | का उपयोग या साथ में बिट्स का उपयोग करें, और अद्यतन अनुमतियों को सेट करने के लिए os.chmod() का उपयोग करें।

उदाहरण:

import os 
import stat 

st = os.stat('somefile') 
os.chmod('somefile', st.st_mode | stat.S_IEXEC) 
+2

यह केवल यह द्वारा निष्पादन योग्य बनाता है अमेरिका एर। पोस्टर "chmod + x" के बारे में पूछ रहा था जो इसे बोर्ड (उपयोगकर्ता, समूह, दुनिया) में निष्पादन योग्य बनाता है –

+26

इसे सभी द्वारा निष्पादन योग्य बनाने के लिए निम्न का उपयोग करें ... stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH। नोट: वह मान ऑक्टल 0111 जैसा ही है, इसलिए आप केवल st.st_mode कर सकते हैं 0111 –

+0

[नीचे मेरा जवाब] (http: // stackoverflow।कॉम/ए/30463972/119527) आर बिट्स को एक्स पर प्रतिलिपि बनाता है, क्योंकि एक कंपाइलर कहने की अपेक्षा करता है। –

12

उपकरण है कि निष्पादन योग्य फ़ाइलों (जैसे स्क्रिप्ट) उत्पन्न के लिए, निम्न कोड उपयोगी हो सकता है:

def make_executable(path): 
    mode = os.stat(path).st_mode 
    mode |= (mode & 0o444) >> 2 # copy R bits to X 
    os.chmod(path, mode) 

इस बनाता है यह (कम या ज्यादा) umask का सम्मान है कि जब फ़ाइल बनाई गई थी तब प्रभावी था: निष्पादन योग्य केवल उन लोगों के लिए सेट है जो पढ़ सकते हैं।

उपयोग:

path = 'foo.sh' 
with open(path, 'w') as f:   # umask in effect when file is created 
    f.write('#!/bin/sh\n') 
    f.write('echo "hello world"\n') 

make_executable(path) 
+2

पायथन 3 में ऑक्टल अक्षर बदल गए। '0444' के बजाय, आप' 0o444' का उपयोग करेंगे। या, यदि आप दोनों का समर्थन करना चाहते हैं, तो बस '2 9 2' लिखें। – Kevin

+1

@ केविन यह [जैसा दिखता है] (https://docs.python.org/3.0/whatsnew/3.0.html#new-syntax) नया वाक्यविन्यास Python 2.6 द्वारा समर्थित किया गया है, इसलिए इसका उपयोग करना उचित लगता है। (एक संगतता संदर्भ बिंदु के लिए, CentOS 6 पायथन 2.6 के साथ जहाजों)। –

+2

मुझे पता नहीं था कि पाइथन 3 ने पारंपरिक ऑक्टल अक्षरों को हटा दिया था। तो इसके लिए आपका शुक्रिया। –

2

तुम भी फ़ाइल

$ ls -l hello.txt 
-rw-r--r-- 1 morrison staff 17 Jan 13 2014 hello.txt 

अब ऐसा करने के इस

>>> import os 
>>> st = os.stat("hello.txt") 

वर्तमान सूची कर सकते हैं।

>>> os.chmod("hello.txt", st.st_mode | 0o111) 

और आप इसे टर्मिनल में देखेंगे।

ls -l hello.txt  
-rwxr-xr-x 1 morrison staff 17 Jan 13 2014 hello.txt 

आप बिटवाइज़ या 0o111 साथ कर सकते हैं सब लिखने योग्य बनाने के लिए सभी निष्पादन योग्य 0o222 बनाने के लिए, और 0o444 सभी पठनीय बनाने के लिए।

3

यदि आप अपनी इच्छित अनुमतियों को जानते हैं तो निम्न उदाहरण इसे सरल रखने का तरीका हो सकता है।

अजगर 2:

os.chmod("/somedir/somefile", 0775) 

अजगर 3:

os.chmod("/somedir/somefile", 0o775) 

या तो (अष्टाधारी रूपांतरण) के साथ संगत:

os.chmod("/somedir/somefile", 509) 

संदर्भ permissions examples

+4

यह os.chmod होना चाहिए ("/ somedir/somefile", 0o775) –

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

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