Soru Python: Komut satırından işlevi çalıştır


Dosyamın altında kodum var:

def hello():
    return 'Hi :)'

Bunu komut satırından nasıl çalıştırırım?


228
2017-10-21 11:44


Menşei


Muhtemelen demek istedin print "Hi :)" yerine return 'Hi :)'. - Tamás
Bunların çoğaltılması: stackoverflow.com/search?q=%5Bpython%5D+run+command+line - S.Lott


Cevaplar:


İle -c  (Komut) argüman (dosyanızın adlandırılmış olduğunu varsayarak) foo.py):

$ python -c 'import foo; print foo.hello()'

Alternatif olarak, ad alanı kirliliğine önem vermiyorsanız:

$ python -c 'from foo import *; print hello()'

Ve orta zemin:

$ python -c 'from foo import hello; print hello()'

370
2017-10-21 11:52



Windows kabuğunda, bekar yerine çift tırnak işareti gerektiğini hatırladım. $python -c "import foo;foo.hello()" - Arindam Roychowdhury
Dosya yerel dizinde veya PYTHONPATH'da değilse ne olur? - Konstantin
Ubuntu Linux'ta, örneğin bir Qt uygulamasının içinden komutu çalıştırırsanız çift tırnak kullanmanız gerekir. - Olaf Japp
İkincisi daha genel bir cevaptır. Birden fazla müşteri işlevini tanımlayan bir komut dosyası var ve yalnızca ihtiyacım olana bağlı olarak birini arayın - xappppp


Sadece koy hello() Fonksiyonun altında bir yerde ve yaptığınız zaman python your_file.py

Daha iyi bir çözüm için bunu kullanabilirsiniz:

if __name__ == '__main__':
    hello()

Bu şekilde, işlev sadece dosyayı çalıştırdığınızda değil, dosyayı içe aktardığınızda yürütülür.


85
2017-10-21 11:52



bu doğru cevap olmalı - zon7
Ve ya eğer hello() komut satırı tarafından sağlanacak argümanları alır? - Anonymous
Bu durumda gönderebilirsiniz sys.argv yönteme Ya da merhaba yönteminden erişin - Wolph
Bu cevap ile içe aktarma çözümü arasında bir fark, ithalat foo'nun foo'da değişiklik yapmadan foo'da keyfi bir işlevi çağırmasına izin vermesidir. - plafratt
Bu doğru, ancak bu çözümü test amaçlarının dışında önermem. - Wolph


python -c 'from myfile import hello; hello()' nerede myfile Python betiğinizin basename ile değiştirilmelidir. (Örneğin., myfile.py olur myfile).

Ancak eğer hello() Python betiğinizdeki "kalıcı" ana giriş noktanız, daha sonra bunu yapmak için normal yol aşağıdaki gibidir:

def hello():
    print "Hi :)"

if __name__ == "__main__":
    hello()

Bu, komut dosyasını yalnızca çalıştırarak yürütmenize izin verir. python myfile.py veya python -m myfile.

Burada bazı açıklamalar: __name__ yürütülmekte olan modülün adını tutan özel bir Python değişkeni, dışında Modül komut satırından başlatıldığında, bu durumda "__main__".


41
2017-10-21 11:51



Arasındaki fark nedir python -m foo -c 'foo.bar()' ve python -c 'import foo; foo.bar()'? İlk durumda -c argümanının görmezden geldiği yerde farklı davranışlar alıyorum. - Abram


Bir bash komut satırından alınabilen hızlı bir Python betiği yazdım. Aramak istediğiniz modülün, sınıfın ve yöntemin adını ve geçmek istediğiniz parametreleri alır. Bunu PyRun olarak adlandırıyorum ve .py uzantısını bıraktım ve chmod + x PyRun ile çalıştırılabilir hale getirdim, böylece aşağıdaki gibi hızlıca arayabilirim:

./PyRun PyTest.ClassName.Method1 Param1

Bunu PyRun adlı bir dosyaya kaydedin

#!/usr/bin/env python
#make executable in bash chmod +x PyRun

import sys
import inspect
import importlib
import os

if __name__ == "__main__":
    cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
    if cmd_folder not in sys.path:
        sys.path.insert(0, cmd_folder)

    # get the second argument from the command line      
    methodname = sys.argv[1]

    # split this into module, class and function name
    modulename, classname, funcname = methodname.split(".")

    # get pointers to the objects based on the string names
    themodule = importlib.import_module(modulename)
    theclass = getattr(themodule, classname)
    thefunc = getattr(theclass, funcname)

    # pass all the parameters from the third until the end of 
    # what the function needs & ignore the rest
    args = inspect.getargspec(thefunc)
    z = len(args[0]) + 2
    params=sys.argv[2:z]
    thefunc(*params)

İşte nasıl çalıştığını göstermek için örnek bir modül. Bu PyTest.py adlı bir dosyaya kaydedilir:

class SomeClass:
 @staticmethod
 def First():
     print "First"

 @staticmethod
 def Second(x):
    print(x)
    # for x1 in x:
    #     print x1

 @staticmethod
 def Third(x, y):
     print x
     print y

class OtherClass:
    @staticmethod
    def Uno():
        print("Uno")

Şu örnekleri çalıştırmayı deneyin:

./PyRun PyTest.SomeClass.First
./PyRun PyTest.SomeClass.Second Hello
./PyRun PyTest.SomeClass.Third Hello World
./PyRun PyTest.OtherClass.Uno
./PyRun PyTest.SomeClass.Second "Hello"
./PyRun PyTest.SomeClass.Second \(Hello, World\)

İkinci yönteme tek parametre olarak bir tuple geçmek için parantezlerden kaçmanın son örneğini not edin.

Yöntemin ihtiyaç duyduğu şey için çok az parametre aktarırsanız hata alırsınız. Çok fazla geçerseniz, ekstraları yok sayar. Modül mevcut çalışma klasöründe olmalı, PyRun yolunuza herhangi bir yerde olabilir.


20
2018-03-18 19:25



Güzel, ama bu soruya gerçekten bir cevap değil. - Francis Colas
Naçizane size katılmıyorum; tam olarak soru. Bir dosyadan bir işlevi nasıl çalıştırdığınızı sordu ve bu tam olarak ne yaptığını sordu. - Joseph Gagliardo
Cmd_folder hakkında ne yaptıklarını anlatabilir misin? - RyanDay


İlginçtir ki, eğer hedef komut satırı konsoluna yazdırmak ya da başka bir dakika python işlemi gerçekleştirmekse, python yorumlayıcısına girişi şu şekilde yapabilirsiniz:

echo print("hi:)") | python

boru dosyalarının yanı sıra ..

python < foo.py

* Uzantının ikinci çalışma için .py olması gerekmediğini unutmayın. ** Ayrıca, bash için karakterlerden kaçmanız gerekebilir.

echo print\(\"hi:\)\"\) | python

4
2018-02-11 08:46



Hello () örneğiyle foo.py düşünülürse, yukarıdaki fikirle birlikte bu şekilde kullanılabilir. echo import foo;foo.hello() | python - Arindam Roychowdhury
Bu yöntemle komut satırı argümanlarını iletmenin bir yolu var mı? - iamseiko
FWIW, aşağıdaki üçüncü örnek için biraz daha temizdir: echo 'print("hi:)")' | python - user3166580


Runp paketini ile yüklerseniz pip install runp onun koşma meselesi:

runp myfile.py hello

Deposu şu adreste bulabilirsiniz: https://github.com/vascop/runp


3
2017-12-29 10:08





Bunu biraz daha kolaylaştıralım ve sadece bir modül kullanalım ...

Deneyin: pip install compago

Sonra yaz:

import compago
app = compago.Application()

@app.command
def hello():
    print "hi there!"

@app.command
def goodbye():
    print "see ya later."

if __name__ == "__main__":
    app.run()

Öyleyse böyle kullan:

$ python test.py hello
hi there!

$ python test.py goodbye
see ya later.

Not: bir böcek Şu anda Python 3'te, ancak Python 2 ile harika çalışıyor.

Düzenle: Bence daha iyi bir seçenek, benim düşüncem ateş Google tarafından işlev argümanlarını da iletmeyi kolaylaştırır. İle yüklü pip install fire. GitHub'larından:

İşte basit bir örnek.

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)

Ardından, komut satırından şunları çalıştırabilirsiniz:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30

3
2018-06-05 00:47





Komut satırında çeşitli python yardımcı programlarını (aralık, dizi vb.) Kullanma gereği vardı ve aracı yazmıştım. pyfunc özellikle bunun için. Komut satırı kullanım deneyimini zenginleştirmek için kullanabilirsiniz:

 $ pyfunc -m range -a 1 7 2
 1
 3
 5

 $ pyfunc -m string.upper -a test
 TEST

 $ pyfunc -m string.replace -a 'analyze what' 'what' 'this'
 analyze this

2
2018-03-17 19:26





Bu işlev, işlenmemiş olarak gidecek bir değer döndürdüğü için komut satırından çalıştırılamaz. Dönüşü kaldırabilir ve bunun yerine baskı kullanabilirsiniz


0
2017-10-21 11:53





Komut satırında komutla python girmek her zaman bir seçenek piton

daha sonra dosyanızı içe aktarın import example_file

sonra komutu ile çalıştırın example_file.hello ()

Bu, python -c'yi her çalıştırdığınızda kırpılan garip .pyc kopyalama işlevini önler.

Belki tek bir komut kadar uygun değil, ama komut satırından bir dosyaya metin yazmak için iyi bir hızlı düzeltme ve dosyanızı çağırmak ve yürütmek için python'u kullanmanıza izin verir.


0
2018-06-17 22:17





Böyle bir şey: call_from_terminal.py

# call_from_terminal.py
# Ex to run from terminal
# ip='"hi"'
# python -c "import call_from_terminal as cft; cft.test_term_fun(${ip})"
# or
# fun_name='call_from_terminal'
# python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
def test_term_fun(ip):
    print ip

Bu basta çalışıyor.

$ ip='"hi"' ; fun_name='call_from_terminal' 
$ python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
hi

0
2018-03-24 23:35