2010-12-11 12 views
8

Sahip olmak istediğim bir Bash-Terminaline girdiğim tüm komutların bir Python komut dosyası tarafından sarıldığı bir mekanizmadır. Python-script, girilen komutu yürütür, ancak bazı ek büyü ekler (örneğin "dinamik" ortam değişkenlerini ayarlama). Bu bir şekilde mümkün mü?Bir Python betiğiyle girilen tüm komutları bir Python betiği ile sarın

Ubuntu ve Debian Squeezy çalıştırıyorum.

ilave açıklamalar:

Ben dinamik olarak değişir bir özellik-dosya var (bazı scriptler istediğiniz zaman değiştirebilir yoktur). Bu dosyadaki tüm kabuk dosyalarındaki ortam değişkenleri olarak özelliklere ihtiyacım var. Tabii ki mülkiyet dosyasını bir şekilde kabuktan ayrıştırabilirim, ama Python (ve ConfigObject) ile yapılabildiği için (özellikle yazmak için) nesne yönelimli bir stil kullanmayı tercih ederim.

Bu nedenle tüm komut dosyalarını tüm Python betikleriyle (komut dosyalarını kendileri üzerinde değişiklik yapmak zorunda kalmadan) tüm özellikleri, tüm Kabuk komut dosyalarına taşıyacak şekilde sarmak istiyorum. Bu benim geçerli kullanım durumum, ancak daha sonra sarıcımı daha sonra genişletebileceğim ek durumlar bulabileceğimi hayal edebiliyorum. Ben yardımcı olabilecek iki şey başka bir şey bilmiyorum

+0

Ne yapmak istediğinizi daha ayrıntılı hale getirebilir misiniz? Kabuk komutlarını nasıl saracaksınız ve bunları nasıl yapacaksınız? İki (veya daha fazla) yolla yapılabilir: a) komutu bir dize olarak ele al, bu dizeye bir şey ekle ve bu dizeyi bash'da çalıştır; b) komutu alın, bash'ı altprocess veya başka bir şeyi kullanarak çalıştırın ve komutu iletin (başka bir komutla önceleri). – khachik

cevap

11

Bash Kabuğuna yazılan her komutu mükemmel bir şekilde sarma .bashrc içindeki PROMPT_COMMAND değişkenini değiştirmektir. Her komutun önce bazı Python şeyler yapmak istiyorsanız Örneğin, benim soru soruldu sevdim:

.bashrc:

# ... 
PROMPT_COMMAND="python mycoolscript.py; $PROMPT_COMMAND;" 
export $PROMPT_COMMAND 
# ... 

artık her önce mycoolscript.py çalıştırılır senaryoyu komutu.

0

Eğer

  • http://sourceforge.net/projects/pyshint/
  • ipython kabuğu

      iterpreter içinde komutlar çalıştırmak bazı işlevleri vardır izleyin.
  • +1

    Evet ben ipython biliyorum ama aynı zamanda benim standart kabuk py-ify istiyorum;) – ifischer

    1

    Bash'ın DEBUG kapağını kullanın. Detaylandırmam için bana ihtiyacın olursa haberim olsun.

    Düzenleme:

    İşte yapmanız mümkün olabilir şeylerin türlü basit örnek:

    $ cat prefix.py 
    #!/usr/bin/env python 
    print "export prop1=foobar" 
    print "export prop2=bazinga" 
    $ cat propscript 
    #!/bin/bash 
    echo $prop1 
    echo $prop2 
    $ trap 'eval "$(prefix.py)"' DEBUG 
    $ ./propscript 
    foobar 
    bazinga 
    

    Sen security risks of using eval farkında olmalıdır.

    +0

    Ben hata ayıklama tuzak hakkında bazı şeyler okudum, ama "sorunum" için nasıl kullanılacağını herhangi bir yol bulamadık – ifischer

    +0

    @ifischer: Sizin python komut dosyası, bir çocuk kabuğunun ortamını etkileyebilir, ancak geçerli kabuğun ortamını etkileyemez. İşleminizi, Bash'de DEBUG tuzağını kullanarak (muhtemelen bir işlem yapmak ve bir şekilde Bash için bir ipucu olarak sonucun çıktısını almak) veya cevabınızda yaptığınız gibi bir sarıcı kullanarak yapmanız gerekir. Neyi başarmaya çalıştığınıza dair daha ayrıntılı bilgiler yayınlarsanız, daha fazla yardımcı olabilir veya kullanacağınız farklı bir yönteme yönlendirebilirim. –

    +0

    Her komut dosyasını x-script'imle çalıştırdığım sürece, değişkenler geçerli kabukta etkilenmez. Bu yüzden, çözümümden oldukça memnunum, her komuttan önce x yazmam gerekiyor (ancak bu mekanizmalar olmadan komut dosyalarını çalıştırmak istersem bunun da bir avantajı var). Sorgumdaki kullanım durumum hakkında bazı ek açıklamalar yaptım. Şimdi yeterince açık olup olmadığını bana bildirin. – ifischer

    -2

    Bunu yapabileceğiniz doğrudan bir yol yoktur. Ancak, bir bash terminaline öykünme yapmak için bir python komut dosyası hazırlayabilirsiniz ve istediğiniz gibi iletmek için python'daki güzel "Altprocess" modülünü kullanabilirsiniz

    İlgili konular