ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python script with powershell extension(.ps1)
    카테고리 없음 2022. 6. 7. 01:22

    거의 리눅스에서만 작업을 하는데, 윈도우즈에서 잠깐 작업을 할 일이 생겨서 윈도우즈에서 작업을 하는데 적응을 잘 못하고 있다.

     

    python in powershell

     

    python script를 실행시키는데, 실행방법이 두가지가 있다.

     

    첫번째는 매번 'python 스크립트이름.py' 를 실행시키는 방법, 두번째는 '.\스크립트이름.py'로 실행시키는 방법. 첫번째 방법의 경우 conda같이, 실행시키는 python binary가 바뀌는 환경에서도 사용이 가능하지만, 두번째 방법은 conda나 virtualenv같은 python binary가 바뀌는 환경에서는 사용이 불가능하다. 

     

    file association이 window system내에서 일어나기 때문에, conda activation을 할때 python file에 대한 association을 바꿔주기 전에는 해결할 방법이 없다, 그렇다고, conda activation시에 .py에 대한 association을 바꿔주게 되면, global 설정이기 때문에 어떤 문제가 생길지 예측 할 수 없게 된다.

     

    그래서 잠시 고민하다가, 겉보기에는 powershell script처럼 생겼는데, 내용은 python script이고, 실행은 현재 context에 맞는 python binary를 통해서 할 수 있는 방법을 고민해 보았다.

    아래의 내용을 script.ps1 , 즉 ps1 확장자로 저장을 하면, .\script 혹은 경로에 들어있을 경우에는 그냥 script 로 실행시킬수 있는 파워쉘의 탈을 쓴 python script가 된다. 이때 사용되는 python은 global python이 아닌 현재 환경변수에서 지정하는, 즉 activate된 conda환경에 있는 python이 된다.

     

    심지어, git에 커밋된 경우, linux에서 chmod +x만 되어 있다면 "./script.ps1" 으로 실행도 가능하다, 마찬가지로 python은 "/usr/bin/env python" 에 의해서 현재 activate 된 conda환경의 python이다.

    패키징할때 간혹 유용하게 사용될 수 있는 윈도우즈와 linux 양쪽에서 사용할 수 있는 방법이다.

    # /usr/bin/env python
    """
    " | out-null
    (Get-Content $PSCommandPath | & python - $args)
    Exit 0
    "
    """
    
    import sys
    print(sys.path)
    print(sys.argv)

     

    한가지 문제점이라면, 편집기의 syntax 가 python이 아닌 powershell로 잡힌다는거지만, entrypoint만 불러주는 스크립트용으로는 쓸만 할 것이다.

    댓글

Designed by Tistory.