명령 행에서 기능 실행


363

이 코드가 있습니다 :

def hello():
    return 'Hi :)'

커맨드 라인에서 어떻게 직접 실행합니까?


21
아마 당신은 print "Hi :)"대신에 의미 했다 return 'Hi :)'.
Tamás

답변:


566

-c (command) 인수를 사용하여 ( 파일 이름이이라고 가정 foo.py) :

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

또는 네임 스페이스 오염에 관심이없는 경우 :

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

그리고 중간계 :

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

32
Windows 셸에서는 작은 따옴표 대신 큰 따옴표가 필요합니다. $python -c "import foo;foo.hello()"
Arindam Roychowdhury 2018 년

6
파일이 로컬 디렉토리 또는 PYTHONPATH에 없으면 어떻게합니까?
Konstantin

2
두 번째는 더 일반적인 대답입니다. 여러 고객 기능을 정의한 스크립트가 있으며 내 필요에 따라 하나만 호출합니다
xappppp

1
어떤 이유로 든 이것은 나를 위해 작동하지 않았지만 대신 print foo.hello()했습니다 print(foo.hello()). 나는 이것이 왜 그런지 설명하는 파이썬 지식이 없기 때문에 다른 누군가가 진행중인 것을 설명 할 수 있다면 크게 감사하겠습니다
Jasper

2
@Aakanksha 설명에 감사드립니다. 괄호를 포함하도록 답변을 편집하는 것이 옳습니까? 내가 실수하지 않으면 파이썬 2와 3 모두와 호환됩니다. (이와 같은 순간에 나는 편집 제안을하고 싶었을 것이다.)
Jasper

130

hello()함수 아래 어딘가에 놓으면 수행 할 때 실행됩니다.python your_file.py

깔끔한 솔루션의 경우 다음을 사용할 수 있습니다.

if __name__ == '__main__':
    hello()

이렇게하면 파일을 가져올 때가 아니라 파일을 실행할 때만 함수가 실행됩니다.


3
그리고 hello()명령 행에서 제공해야하는 인수를 취 하면 어떻게 됩니까?
익명

2
이 경우 sys.argv메소드로 보낼 수 있습니다 . 또는 hello 방법으로 액세스하십시오
Wolph

3
이 답변과 import foo 솔루션의 한 가지 차이점은 import foo가 foo를 수정하지 않고 foo에서 임의의 함수를 호출 할 수 있다는 것입니다.
plafratt

사실이지만 테스트 목적 이외의 솔루션은 권장하지 않습니다.
Wolph

@Wolph이 구조를 사용하면 별도의 함수 (내부에 포함되지 않음 hello())를 실행하고 명령 줄에서 어떻게 실행합니까?
Souvik Ray

66

python -c 'from myfile import hello; hello()'여기서 myfile파이썬 스크립트의 기본 이름으로 바꿔야합니다. (예, myfile.py진다myfile ).

그러나 hello()파이썬 스크립트에서 "영구적 인"기본 진입 점 인 경우 일반적인 방법은 다음과 같습니다.

def hello():
    print "Hi :)"

if __name__ == "__main__":
    hello()

이것은 단순히 실행하여 스크립트를 실행 할 수 있습니다 python myfile.py또는 python -m myfile.

여기에 몇 가지 설명이 있습니다 : 명령 행에서 모듈이 시작될 때를 제외하고는__name__ 현재 실행중인 모듈의 이름을 보유하는 특수한 Python 변수입니다 ."__main__"


2
차이점은 무엇이며 python -m foo -c 'foo.bar()'그리고 python -c 'import foo; foo.bar()'? 첫 번째 경우 -c 인수가 무시되는 것처럼 다른 동작이 발생합니다.
Abram

29

bash 명령 줄에서 호출 할 수있는 빠르고 작은 Python 스크립트를 작성했습니다. 호출하려는 모듈, 클래스 및 메소드의 이름과 전달하려는 매개 변수를 사용합니다. 나는 그것을 PyRun이라고 부르고 .py 확장자를 남겨두고 chmod + x PyRun으로 실행 가능하게 만들면 다음과 같이 빨리 호출 할 수 있습니다.

./PyRun PyTest.ClassName.Method1 Param1

이것을 PyRun이라는 파일에 저장하십시오

#!/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)

작동 방식을 보여주는 샘플 모듈은 다음과 같습니다. 이것은 PyTest.py라는 파일에 저장됩니다.

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

다음 예제를 실행하십시오.

./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\)

튜플을 튜플에 전달하기 위해 괄호를 이스케이프 처리하는 마지막 예를 참고하십시오.

메소드에 필요한 매개 변수가 너무 적 으면 오류가 발생합니다. 너무 많이 전달하면 추가 내용을 무시합니다. 모듈은 현재 작업 폴더에 있어야하며 PyRun은 경로의 어느 위치 에나 놓을 수 있습니다.


2
멋지지만 질문에 대한 답은 아닙니다.
Francis Colas

14
나는달라고 간청한다. 정확히 질문입니다. 그는 파일에서 어떻게 함수를 실행하는지 물었고 이것이 정확히 무엇인지를 물었습니다.
Joseph Gagliardo

cmd_folder에 대한 비트가 무엇인지 설명 할 수 있습니까?
RyanDay

26

이 스 니펫을 스크립트 하단에 추가하십시오.

def myfunction():
    ...


if __name__ == '__main__':
    globals()[sys.argv[1]]()

이제 다음을 실행하여 함수를 호출 할 수 있습니다.

python myscript.py myfunction

이것은 명령 줄 인수 (함수 이름의 문자열)를 전달하기 때문에 작동합니다 locals 현재 로컬 심볼 테이블이있는 사전에 합니다. 마지막에있는 패리티 스는 함수를 호출 할 것입니다.

업데이트 : 함수가 명령 줄에서 매개 변수를 수락하도록하려면 다음 sys.argv[2]과 같이 전달 하십시오.

def myfunction(mystring):
    print mystring


if __name__ == '__main__':
    globals()[sys.argv[1]](sys.argv[2])

이렇게하면 running python myscript.py myfunction "hello"이 출력 hello됩니다.


이 메소드가 함수의 매개 변수를 승인 할 수 있습니까? 예 :myfunction(12)
Major Major Major

@MajorMajor이 작업을 수행하는 방법을 포함하여 답변을 업데이트했습니다.
Noam Hacker

라이브 프로덕션에서 이것이 위험합니까? 단위 테스트로 만들고 싶습니다.
Ardhi

9

이것을 좀 더 쉽게 만들고 모듈을 사용합시다 ...

시험: pip install compago

그런 다음 다음을 작성하십시오.

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

그런 다음 다음과 같이 사용하십시오.

$ python test.py hello
hi there!

$ python test.py goodbye
see ya later.

참고 : 현재 Python 3 에는 버그 가 있지만 Python 2에서는 훌륭하게 작동합니다.

편집 : 더 나은 옵션은 제 의견으로는 함수 인수를 쉽게 전달할 수있는 Google 의 모듈 화재 입니다. 와 함께 설치됩니다 pip install fire. 그들의 GitHub에서 :

다음은 간단한 예입니다.

import fire

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

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

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

그런 다음 명령 행에서 다음을 실행할 수 있습니다.

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

+1. Fire에는 스크립트를 변경하지 않고 함수를 호출하는 방법도 있습니다 python -m fire file_name method_name. 또한 내장 argparser가 있습니다.
user3265569

6

흥미롭게도, 목표가 명령 행 콘솔에 인쇄하거나 다른 작은 파이썬 작업을 수행하는 것이라면 입력을 다음과 같이 파이썬 인터프리터로 파이프 할 수 있습니다.

echo print("hi:)") | python

파이프 파일뿐만 아니라

python < foo.py

* 두 번째가 작동하기 위해 확장명이 .py 일 필요는 없습니다. ** 또한 bash의 경우 문자를 이스케이프해야 할 수도 있습니다.

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

hello () 예제와 함께 foo.py를 고려하면, 위의 아이디어와 함께 사용할 수 있습니다. echo import foo;foo.hello() | python
Arindam Roychowdhury

이 방법으로 명령 줄 인수를 전달할 수있는 방법이 있습니까?
sparkonhdfs

1
FWIW, 다음은 세 번째 예에서 약간 더 깨끗합니다.echo 'print("hi:)")' | python
user3166580


4

커맨드 라인에서 다양한 파이썬 유틸리티 (범위, 문자열 등)를 사용해야 한다는 요구 사항이 있었고 특별히 pyfunc 도구를 작성 했습니다. 이를 사용하여 명령 줄 사용 경험을 풍부하게 할 수 있습니다.

 $ 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

1

항상 명령을 사용하여 명령 행에 python을 입력하는 옵션입니다 파이썬

그런 다음 파일을 가져옵니다. 가져 오십시오. example_file을 가져 오십시오.

그런 다음 명령을 실행하십시오. example_file.hello ()로

이것은 python -c 등을 실행할 때마다 발생하는 이상한 .pyc 복사 기능을 피합니다.

아마도 단일 명령만큼 편리하지는 않지만 명령 줄에서 파일을 텍스트로 신속하게 수정하고 파이썬을 사용하여 파일을 호출하고 실행할 수 있습니다.


1

이와 같은 것 : 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

이것은 bash에서 작동합니다.

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

1

아래는 함수 정의가있는 Odd_Even_function.py 파일입니다.

def OE(n):
    for a in range(n):
        if a % 2 == 0:
            print(a)
        else:
            print(a, "ODD")

이제 아래의 명령 프롬프트에서 동일하게 호출하는 옵션이 저에게 효과적이었습니다.

옵션 1 exe \ python.exe의 전체 경로 -c "import Odd_Even_function; Odd_Even_function.OE (100)"

옵션 2 exe \ python.exe -c의 전체 경로 "from Odd_Even_function import OE; OE (100)"

감사.


0

이 함수는 처리되지 않은 값을 반환하므로 명령 줄에서 실행할 수 없습니다. 반품을 제거하고 대신 인쇄를 사용할 수 있습니다


-2

사용 파이썬-C의 (도구를 핍 파이썬-C 설치 )하고 간단하게 쓰기 :

$ python-c foo 'hello()'

또는 파이썬 파일에서 함수 이름 충돌이없는 경우 :

$ python-c 'hello()'

-2

먼저 그들이 말한대로 함수를 호출해야합니다. 그렇지 않으면 founction은 출력에 아무것도 표시하지 않습니다. 그런 다음 파일을 저장하고 파일의 폴더를 마우스 오른쪽 버튼으로 클릭하고 "파일 복사"를 클릭하여 파일의 경로를 복사하십시오 터미널로 이동하여 다음을 작성하십시오.-cd "파일 경로"-python "파일 이름 (예 : main.py)"후에 코드 출력이 표시됩니다.


-4

Spyder를보다 쉽게 ​​설치하십시오. 파일을 연 다음 실행하십시오 (녹색 화살표 클릭). 그런 다음 hello()메소드가 정의되어 IPython 콘솔에 알려 지므로 콘솔에서 메소드를 호출 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.