आप अजगर के भीतर से एक सरल "chmod + x" कैसे करते हैं?


119

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

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

ऐसा प्रतीत होता os.chmodहै कि जिस तरह से यूनिक्स chmodकरता है वह 'अनुमति' नहीं देता है। अंतिम पंक्ति के साथ, फ़ाइल में फ़ाइलकोड है -rw-r--r--, इसके साथ टिप्पणी नहीं की गई है, फ़ाइल मोड है ---x------u+xबाकी मोड्स को बरकरार रखते हुए मैं सिर्फ झंडे को कैसे जोड़ सकता हूं ?

जवाबों:


197

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

उदाहरण:

import os
import stat

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

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

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

1
नीचे मेरा जवाब आर बिट्स को एक्स की नकल करता है, जैसा कि एक कंपाइलर से कहना होगा।
जोनाथन रेनहार्ट

मैं करता हूँ STAT_OWNER_EXECUTABLE = stat.S_IEXEC, और मानव पढ़ने योग्य स्थानीय स्थिरांक का उपयोग करता हूँ बजाय एक गिबरिश के।
थोरसुमोनर

यहां एक गैर-पाइथोनिक जवाब है जो थोड़ा अधिक पठनीय हो सकता है: subprocess.check_call(['chmod', '+x', 'somefile'])और चलिए आप और अधिक आसानी से जैसे ऑपरेशन करते हैं a+rx
ट्रेवर बॉयड स्मिथ

20

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

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। या, यदि आप दोनों का समर्थन करना चाहते हैं, तो बस लिखें 292
केविन

1
@ केविन ऐसा लगता है कि नए सिंटैक्स को पायथन 2.6 द्वारा समर्थित किया गया है, इसलिए इसका उपयोग करना उचित लगता है। (एक संगतता संदर्भ बिंदु के लिए, पायथन 2.6 के साथ सेंटोस 6 जहाज)।
जोनाथन रेइनहर्ट

2
मैं इस बात से अनजान था कि पायथन 3 ने पारंपरिक अष्टक शाब्दिकों को हटा दिया है। तो इसके लिए आपका शुक्रिया।
जोनाथन रेनहार्ट

12

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

अजगर 2:

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

अजगर 3:

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

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

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

संदर्भ अनुमतियाँ उदाहरण


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

4

आप यह भी कर सकते हैं

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

फ़ाइल की वर्तमान सूची

$ ls -l hello.txt
-rw-r--r--  1 morrison  staff  17 Jan 13  2014 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

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


2

umaskजैसे सम्मानchmod +x

man chmodका कहना है कि अगर augoमें नहीं दिया गया है:

chmod +x mypath

तब aउपयोग किया जाता है लेकिन इसके साथ umask:

अक्षरों का एक संयोजन ugoa नियंत्रित करता है कि किस उपयोगकर्ता की फ़ाइल तक पहुँच बदली जाएगी: वह उपयोगकर्ता जो इसका मालिक है (u), फ़ाइल के समूह में अन्य उपयोगकर्ता (g), अन्य उपयोगकर्ता फ़ाइल के समूह में नहीं (o), या सभी उपयोगकर्ता (ए)। यदि इनमें से कोई भी नहीं दिया गया है, तो प्रभाव ऐसा है जैसे (क) दिया गया था, लेकिन umask में सेट बिट्स प्रभावित नहीं होते हैं।

यहां एक संस्करण है जो उस व्यवहार को बिल्कुल अनुकरण करता है:

#!/usr/bin/env python3

import os
import stat

def get_umask():
    umask = os.umask(0)
    os.umask(umask)
    return umask

def chmod_plus_x(path):
    os.chmod(
        path,
        os.stat(path).st_mode |
        (
            (
                stat.S_IXUSR |
                stat.S_IXGRP |
                stat.S_IXOTH
            )
            & ~get_umask()
        )
    )

chmod_plus_x('.gitignore')

यह भी देखें: मैं पायथन में डिफ़ॉल्ट फ़ाइल अनुमतियां कैसे प्राप्त कर सकता हूं?

उबंटू 16.04, पायथन 3.5.2 में परीक्षण किया गया।


1

अजगर 3 में:

import os
os.chmod("somefile", 0o664)

0oउपसर्ग जोड़ने के लिए याद रखें क्योंकि अनुमतियाँ एक ऑक्टल पूर्णांक के रूप में सेट की जाती हैं, और पायथन स्वचालित रूप से किसी भी पूर्णांक के साथ एक अग्रणी शून्य को ऑक्टल के रूप में मानता है। अन्यथा, आप os.chmod("somefile", 1230)वास्तव में गुजर रहे हैं , जो अष्टकोणीय है 664


1
यह अनुमतियों को पूर्ण मान पर सेट करता है, यह chmod +ओपी द्वारा पूछे गए अनुसार नहीं करता है , जो मौजूदा लोगों के लिए नई अनुमतियों को जोड़ना चाहिए।
सिरो सेंटिल्ली 郝海东 冠状 iro i

0

यदि आप पायथॉन 3.4+ का उपयोग कर रहे हैं, तो आप मानक लाइब्रेरी के सुविधाजनक पाथलिब का उपयोग कर सकते हैं ।

इसके पाथ क्लास में बिल्ट-इन चामोड और स्टेट तरीके हैं।

from pathlib import Path


f = Path("/path/to/file.txt")
f.chmod(f.stat().st_mode | stat.S_IEXEC)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.