2012-12-31 12 views
10

Mac OS'de python kullanarak, yazmak için bir dosya açmak ve bazı kabuk komutları koymak istiyorum. Daha sonra terminalde çalıştırılacak.Python'u kullanarak bir dosya için yürütme bitini ayarlama

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

Ben Terminalinde çalıştırdığınızda ben almazsınız Bu dosya oluşturur, ama öyle yürütmek biraz nasıl ayarlanacağını çözemedim:

sh: my_script.sh: Permission denied 
+0

Dosyaya uygun izinleri ayarlamak için alt işlemi kullanın - http://docs.python.org/2/library/subprocess.html – theharshest

+0

@theharshest: Bunu alt işlemlerle nasıl yaparsınız? (Bunun yerine, check_call (['chmod', 'a + x', 'myscript.sh']) 'komutunu kullanabildiğinizi farz edersiniz, bunun yerine, check_call (['echo', 'foo'])' dır. print ('foo') 'eğer gerçekten istiyorsan, ama… neden?) – abarnert

cevap

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

değerini seçin düzgün olsa da. Bazı değerler güvenli olmayabilir.

+0

Çalışır - teşekkürler. –

+4

Python 3 uyumluluğu için '0o744' kullanmanız gerekir. – asmeurer

10

Hep chmod kullanarak, çalıştırmadan önce, Terminal kabuğundan yapabilirsiniz:

chmod a+x my_script.sh 

Eğer Python yapmak istiyorsanız, os modülünde chmod veya fchmod birini kullanabilirsiniz. Zaten dosyasının açık var, ben ikinci yapardım:

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) 

Maalesef gördüğünüz gibi, başka her şeyi yalnız bırakarak herkes için x işaretini ekleyerek chmod a+x için doğrudan bir eşdeğer yoktur. Ama chmod komut satırı aracı aslında yaptığı aynı şeyi yapabilir: stat dosyası (bu durumda, ya, fstat) mevcut izinleri almak için, sonra bunları değiştirin:

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)) 

(Değilsin Aslında çoğu platformda S_IMODE adımına gereksinim duyuyoruz, çünkü ya st_mode hiçbir ekstra bit'e sahip değil veya (f) chmod, OS X'in yaptığı gibi, zararsız bir şekilde göz ardı ediyor. Ancak, kodunuzu taşınabilir ve gelecekteki yapmak için doğru olanı yapmak daha iyidir - geçirmez.)

Çoğu kişi, "dost" isimlerini S_IXUSR gibi özellikle arkadaş canlısı olmamayı (Aynı

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 kullanıcı, grup ve diğeri tarafından yürütülebilir şu anlama gelir: Eğer sekizlik açısından modların düşünmeyi öğrenmek kez ve POSIX şeyleri abbreviates nasıl hatırlamaya çalışarak daha doğrusu kolay, bu yüzden bu tercih edebilirsiniz | (ST_IX* bit'in çeşitli) ve 7777 gibi bir şey, (f) chmod (S_IMODE'un yaptığıyla aynı) geçişine izin verdiğiniz bitlerdir.

İlgili konular