파이썬 터미널 실행 - paisseon teomineol silhaeng

#파이썬실행, #파이썬파일, #pythonfile, #cmd, #cmd명령어, #파이썬cmd, #파이썬도스

https://blog.naver.com/pyxis1981/221932250255

파이썬 설치 및 실행에 대해서는 포스팅을 했었는데, 정작 파이썬 파일을 도스(cmd)에서 실행하는 방법을 언급하지 않았네요.

파이썬에 들어가서 코드를 쓰고 실행을 하는 것과

도스환경에서 파이썬 파일을 실행시키는 것은 다릅니다.

예전에 윈도우가 주 운영체계가 되기전에는 도스라는 환경에서 컴퓨터를 다뤘는데, 지금도 사실 도스를 기반으로 하고 있고, 윈도우는 UI(사용자 인터페이스)로 보기 쉽게 바꿔준거라고 생각됩니다(순전히 제 생각)

예를들어 월급명세서.xlsx라는 파일을 실행시키려면, 지금은 이 파일을 클릭하면 자동으로 엑셀을 실행시키고, 엑셀안에서 이 파일을 열어서 우리한테 보여주는데, 예전 도스 환경이라면, exel.exe 월급명세서.xlsx 이런식으로 적어서, 월급명세서를 어떤 프로그램에 열건지 하나하나 지정해주는 형식입니다.

파이썬 에디터로 파일의 확장자는 .py로 끝납니다. 엑셀이 xlsx, 한글이 hwp와 같은 원리라고 생각하면 됩니다.

그래서 이 .py로 끝나는 파일을 어떻게 실행하는지에 대한 포스팅입니다.

우선 예제 파일은 지난번에 제가 업로드한 for.py파일로 하겠습니다.

우선 cmd를 실행합니다. cmd는 command의 약자이고 윈도우에서 도스 환경으로 연결합니다.

실행은 윈도우키+R을 누릅니다.

C:\USERS\USER 라는 표시는 내가 지금 C:드라이브 폴더-USERS폴더-USER폴더에 들어와 있다는 뜻입니다. 윈도우에서는 폴더라 부르고, 예전 도스환경에서는 DIC 즉 디렉토리라 불렀었던게 기억나네요-

여기서 python을 실행시키면 바로 python이 열립니다.

여기까진 1번 포스팅에서 했던거고 오늘 하려는건 지난번 예제 파일을 실행시키는 방법입니다.

다시 도시환경으로 갑니다. ctrl+z를 누르면 나갑니다.

대부분 프로그램의 실행 형식은 프로그램명령+파일명인입니다.

python for.py라고 실행시키면 되는데

위와같이 에러가 나옵니다. for.py파일은이나 디렉토리가 없다라고 나오네요.

즉 user안에는 for.py파일이 없어서 그렇습니다.

(포스팅 중간에 컴퓨터를 바꿔서 글자체가 달라졌습니다.)

그래서 우선 for.py파일이 있는 폴더로 들어가야하는데. 이때 cmd에 관한 기본 명령어를 알고 있으면 좋습니다.

help를 누르면 다양한 명령어에 대한 소개도 있지만 파이썬 실행에 필요한 것만 할께요.

디렉토리를 바꿀땐, cd 명령어를 쓰라는데..

우선 들어가려는 폴더를 정확히 아는게 좋습니다.

저는 c:\users\sec\PycharmProjects\test 디렉토리(폴더)로 가야합니다.

정확한 디렉토리명을 바로 쓰면 좋긴한데, 디렉토리 명을 잘 모르고 찾아 갈때는 dir로 디렉토리 및 파일이 어떤게 있는지 확인할 수 있습니다.

아래와 같이 그 디렉토리에 들어가지 않고도 경로와 파일명을 정확히 안다면 바로 실행할 수도 있습니다.

에디터에서 실행을 할 수 있기 때문에 평소에 잘 사용하진 않지만, cmd 환경에서 한번씩 잘 되는지 확인하는 것도 중요할거 같습니다. 실제 사용할때는 이런 환경에서 사용하게될 일이 아마 많겠죠..(저도 입문이라 아직 잘 모르지만..)

이상 cmd 환경에서 이미 작성된 파이썬 파일을 실행하는 방법을 알아봤습니다.

마지막으로 cmd에서 우리가 자주 사용하는 명령어(파이썬과 관계 없음)

msconfig를 입력하면 윈도우 시작프로그램 등 관리 할 수 있어서 자주 사용했었네요.

아래와 같이 Terminal 명령어를 python 파일에서 실행위해 사용할 수 있다.

위의 명령어를 사용하고 싶을 때

import os, sys

EXPORT204 = "echo 199 > /sys/class/soft_pwm/export"    #EXPORT 설정

os.system(EXPORT204)                                     #터미널 창에서 쓰는 것과 같음

예를 들어 다른 코드를 사용한다면 

NEWCODE = "명령어 코드"

os.system(NEWCODE)

처럼 사용하면 된다.

실행할때 sudo 명령어로 실행하면 실행되지 않을 수 있다.

파이썬 터미널 실행 - paisseon teomineol silhaeng

그럴때는 sudo를 빼고 실행한다.

Posted by 파워온 : 댓글 0

규도자 개발 블로그

Python/Python

파이썬 스크립트 terminal에서 실행할 때 ModuleNotFoundError 해결하기

규도자 (gyudoza) 2022. 1. 9. 11:49

파이썬 스크립트 terminal에서 실행할 때 ModuleNotFoundError 해결하기

어떤 프로젝트에서 cron이나 migrate tool 등을 커스텀해서 만들어놨다고 시나리오를 짜보자. 이건 프로젝트를 실행할 때 동시에 실행되는 것이 아니라 독립적인 프로세스를 가지고 실행돼야하는 것이다. 구체적인 예를 들어보자.

파이썬 터미널 실행 - paisseon teomineol silhaeng

이건 어떤 framework로 작성한 프로젝트 혹은 뭔가 만들기 위해 체계적으로 작성한 프로젝트가 아니라 내가 그냥 개인적으로 필요한 작업들을 파이썬으로 작성해놓은 것이다. 개중에는 크롤러도 있고, api요청으로 정보를 가져오는 것 그리고 데이터베이스에 쓰는 것, 엑셀로 내뱉는 것 등등 아주 많다. 이건 하나의 프로젝트로 동작하는 프로그램이 아니라 그냥 내가 필요할 때마다 이것저것 실행하는 형태이므로 사실상 각 파일이 터미널창에서 실행했을 때 온전하게 실행돼야할 필요가 있었는데 그때 나를 만난 에러가 바로 ModuleNotFoundError였다. 왜냐. 여기에 작성된 스크립트들이 venv로 설정된 하나의 인터프리터를 공유하고 있는 것은 맞아서 pip를 통해 설치한 라이브러리는 공유되지만 어떤 특정 디렉토리에 들어가서 내가 필요한 스크립트를 실행시키면 상위 파일인 constants.py, 혹은 이웃해있는 다른 디렉토리에 작성해놓은 다른 파이썬 파일들을 참조하지 못한다.

 저 구조에서의 예를 들면 collector라는 디렉토리 안에는 api등 여러곳에서 데이터를 가져오는 함수들이 쓰여져 있고 api디렉토리 내부에는 정말 요청만을 위한 함수들이 작성돼있어서 collector라는 디렉토리 내부에 작성된 파이썬 스크립트를 그냥 시키면 api와 collecor를 참조하는 모듈을 찾지 못하고 ModuleNotFoundError를 뱉고 만다. 그럴 땐 아래처럼 필요한 디렉토리를 참조시키는 함수를 작성해주면 된다.

import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))

그리고 그 밑에 본인이 직접 작성한 파일들에서 필요한 것들을 불러오면 된다. 함수의 구조를 보면 알게지만 단순히 특정 디렉토리를 스크립트에서 강제로 insert시키는 함수이다.

아주 간단한 예로

here_is_outer.py
here_is_inner
└─here_is_inner.py

이런식의 파일구조를 갖고 있는 프로젝트가 있고

# here_is_inner.py
def inner_identification():
    print("This is Inner")
    
# here_is_outer.py
from here_is_inner.here_is_inner import inner_identification


if __name__ == "__main__":
    print("Outer is running...")
    inner_identification()

result

(venv) gyu@gyuui-MacBookPro local_test_python % python here_is_outer.py 
Outer is running...
This is Inner

이런식으로 작성한뒤에 outer 스크립트를 실행시켜보면 inner파일을 참조하는 데 문제가 되지 않는다. 하지만 반대로 inner파일에서 outer파일을 참조하는 스크립트로 실행해보면

# here_is_inner.py
from here_is_outer import outer_identification


if __name__ == "__main__":
    print("Inner is running...")
    outer_identification()

def outer_identification():
    print("This is Outer")

result

Inner is running...
This is Outer

어 왜 되지? 하는 사람은 분명히 IDE에서 루트디렉토리가 설정된 상태로 run을 돌렸을 것이다.

파이썬 터미널 실행 - paisseon teomineol silhaeng

이렇게말이다. 하지만 생짜로 디렉토리에서 스크립트를 실행시켜보면

(venv) gyu@gyuui-MacBookPro here_is_inner % python here_is_inner.py 
Traceback (most recent call last):
  File "/Users/gyu/IdeaProjects/local_test_python/here_is_inner/here_is_inner.py", line 1, in <module>
    from here_is_outer import outer_identification
ModuleNotFoundError: No module named 'here_is_outer'

이렇게 ModuleNotFoundError가 출력되는 것을 확인할 수 있다. 이걸 해결하기 위해 위의 함수를 활용해보자.

# here_is_inner.py
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
# sys.path.insert(0, "/Users/gyu/IdeaProjects/local_test_python/") # 혹은 절대경로

from here_is_outer import outer_identification


def inner_identification():
    print("This is Inner")


if __name__ == "__main__":
    print("Inner is running...")
    outer_identification()

이렇게 작성할 수 있다. 이렇게 작성한 뒤 위 스크립트를 다시 실행시켜보면

(venv) gyu@gyuui-MacBookPro here_is_inner % python here_is_inner.py
Inner is running...
This is Outer

이렇게 잘~ 실행되는 걸 확인할 수 있다. 물론 import와 from구문 사이에 실행되는 함수가 있어서 PEP8 convetion을 지키는 형태가 아니라 flake8이나 black같은 formatter나 linter를 실행시키면 순서가 꼬여서 실행되지 않는 경우가 있으니 해당 이런식으로 작성할 땐 린터 포맷터 사용을 주의하자.

나는 이렇게 대충 슥슥 작성한 스크립트를 전에 다뤘던 set_interval함수와 같이 활용해 몇분마다 웹페이지를 크롤링하거나 api response를 데이터베이스에 집어넣는 작업을 하고 있다. 이걸 활용하면 뭔가 서버에 올리긴 귀찮고 그냥 로컬에서 필요할 때만 잠깐 뭐 몇시간이나 하루정도 돌려도 무관한 그런 프로그램들을 작성해서 돌리기 겁나 편해진다. 디렉토리도 깔끔하게 유지할 수 있다.