/ EXITEM

ipynb 파일 블로그 업로드 자동화

ipynb 파일 블로그 업로드 자동화


주로 사용하는 ipynb으로 블로그에 업로드 하려면

  1. markdown 형식으로 변경
  2. 해당 파일을 포스팅 될 위치에 옮겨준다.
  3. 로컬 블로그에 업로드 해준다.
  4. 깃허브에 PUSH 해준다.

위와 같은 과정을 진행해야 하는데… 1번에서는 필요한 파일만 변경하고 옮겨주었는데 컴퓨터가 고생하는 대신 클릭한번으로 해결하기 위해서 찾아본 방법이다. python 파일을 만들어 배치 파일로 실행하는 방법으로 진행해본다.


목표

“주피터랩_원본”에 있는 ipynb 파일들을 md 파일로 변형하여 모두 “exitem”에 맞는 경로에 넣기

목표 결과

  • 주피터랩_원본
    • exitem
      • ….ipynb
      • ….ipynb
    • github
      • ….ipynb
      • ….ipynb
    • python
      • ….ipynb
      • ….ipynb

위의 폴더에 있는 내용을 변형 후 아래 파일 위치로 이동(원래 파일일 있을 경우 덮어쓰기)

  • _posts
    • exitem
      • ….mb
      • ….mb
    • github
      • ….mb
      • ….mb
    • python
      • ….mb
      • ….mb

해결 방법

  • ipynb 이 위치한 모든 경로 탐색
  • nbconvert 로 ipynb 에서 md 형식으로 변경
    • python에서 유닉스 명령어 실행하는 방법 subprocess( call ) 참조
    • nbconvert 로 ipynb 에서 md 형식으로 변경 참조
  • cmd에서 경로 띄어쓰기 인식
    • 경로 중 띄어쓰기가 있으면 경로 양쪽에 “” 를 추가해주면 된다.참조
import os
from subprocess import call
Before_path = "C:/Users/tkd8484/Desktop/chanp5660/주피터랩_원본"
After_path = "C:/Users/tkd8484/Desktop/chanp5660/blogmaker/_posts"

jekyll_upload_path = "C:/Users/tkd8484/Desktop/chanp5660/blogmaker"
Github_upload_path = "C:/Users/tkd8484/Desktop/chanp5660/[GitHubPage]"
branch_ID = "master"

MASSAGE = input("commit massage를 입력해주세요.")
CH_JEKYLL = input("jekll 업로드 해야하나요?(y,n)")
for (path,dir,files) in os.walk(Before_path):
    if "." in path:continue
    for filename in files:
        if not filename.endswith(".ipynb"): # ipynb 파일만 변경한다.
            continue
        before_ipynb = f"{path}/{filename}" # 기존 ipynb 경로
        before_md = before_ipynb.replace(".ipynb",".md") # 변환된 md 경로 
        after_md = before_md.replace(Before_path,After_path) # 이동될 경로 
        #print(f"before_ipynb : {before_ipynb}\nbefore_md : {before_md}\nafter_path : {after_md}\n")
        
        
        COMMAND_convert = f'jupyter nbconvert --to markdown "{before_ipynb}"' # 변환 코드
        if call(COMMAND_convert) :# 변환 실행
            print("--------------jupyter nbconvert --to markdown ERROR-------------")
            print(f"before_ipynb : {before_ipynb}\nbefore_md : {before_md}\nafter_path : {after_md}\n")
            
            
        COMMAND_mv = f'mv "{before_md}" "{after_md}"' # 이동 코드
        if call(COMMAND_mv) : # 이동 실행
            print("--------------mv ERROR-------------")
            print(f"before_ipynb : {before_ipynb}\nbefore_md : {before_md}\nafter_path : {after_md}\n")

        print(f"{after_md} 저장완료")
  • ipynb 파일에서 md 파일로 변경되었으니 지킬 블로그에 업로드

bash

call cd C:\Users\tkd8484\Desktop\chanp5660\blogmaker
call bundle exec jekyll serve
if CH_JEKYLL=="y":
    os.chdir(jekyll_upload_path) # change directory
    if call("bundle exec jekyll serve"):
        print("------------ERROR jekyll--------------")
  • git을 이용하려면 .git 이 있는 해당폴더로 직접 이동해야하므로 경로를 이동해서 git을 업로드 한다.
    • 폴더 내에 이미 git이 원격 설정 되어 있어야 한다.
os.chdir(Github_upload_path) # change directory

if call("git remote -v"):
    print("------------ERROR git remote -v------------")
    
if call("git add -A"):
    print("------------ERROR git add -A------------")
    
COMMAND_commit_m = f'git commit -m "{MASSAGE}"'
if call(COMMAND_commit_m):
    print(f'------------ERROR {COMMAND_commit_m}------------')
    
CAMMAND_push = f"git push origin {branch_ID}"
if call(f"git push origin {CAMMAND_push}"):
    print(f"------------ERROR git push origin {CAMMAND_push}------------")

jupyter lab에서 python 파일로 변경하고 배치 파일로 실행하기

  • jupyter lab에서 실행할 파일에서 File - Save and Export Notebook As … - Executable Script 실행한다.
  • “다운로드” 경로에 저장되며 실행할 수 있는 .py 파일이다.
  • 하지만 중간에 jupyter 명령어는 가상환경에서 실행한 함수이므로 배치파일로 가상환경을 킨 상태에서 파일을 실행한다.

  • 배치 파일 생성 (Github_upload_auto.bat)
set root=C:\Users\tkd8484\anaconda3
call %root%\Scripts\activate.bat %root%
call conda activate chanp5660
call "C:\Users\tkd8484\Desktop\chanp5660\2022-07-20-ipynb파일 블로그 업로드 자동화.py"

pause

결론

  • ipynb에서 md 파일로 모두 바꾸는건 자동화 성공
  • 중간에 bundle exec jekyll serve 명령어가 실행되지 않아서 지킬업로드를 따로 해주고 github upload로 배치파일을 따로 만들어주었다.

  • 총 실행파일 3개
    • 실행_ipynb_to_md.bat : ipynb에서 md 파일로 변경 및 이동
    • 실행_Github_127.bat : jekyll 업로드
    • 실행_Github_upload : 깃허브 업로드(버전저장)


ipynb 파일 블로그 업로드 자동화 version2

  • 기존의 코딩의 문제점 모든 파일을 새로 다시 생성하고 추가한다.
    • git에서 버전관리가 쉽지 않다.
    • ipynb to md.bat 실행 시간이 오래걸린다.

-> 따라서 최종 변경된 파일의 업로드 시간 이후에 파일만 변경하여 업로드 한다.

파일 수정 정보 읽기 os.psth.getmtime

import os
import datetime as dt
from subprocess import call
Path_Checktime = "C:/Users/tkd8484/Desktop/chanp5660/blogmaker" # md 파일의 제일 상위 위치


##### md 최근 수정된 날짜 시간을 확인해서 그 이후로만 ipynb -> md  #####
modified_date_list= []
for (path,dir,files) in os.walk(Path_Checktime):
    if "." in path:continue
    for filename in files:
        if not filename.endswith(".md"):continue # md 파일만 변경한다.
            
        modified_date = os.path.getmtime(f'{path}/{filename}')
        modified_date_list.append(modified_date)

MAX_M_DATE = max(modified_date_list)
MAX_M_DATE_str = dt.datetime.fromtimestamp(MAX_M_DATE).strftime("%Y%m%d , %H:%M")
print(f"가장 최근 업로드 {MAX_M_DATE_str} 이므로 그 이후로 업로드 한다.")


Before_path = "C:/Users/tkd8484/Desktop/chanp5660/주피터랩_원본" # ipynb 위치
After_path = "C:/Users/tkd8484/Desktop/chanp5660/blogmaker/_posts" # 포스팅 위치
Index_path = "C:/Users/tkd8484/Desktop/chanp5660/blogmaker/about" # index.md 위치

for (path,dir,files) in os.walk(Before_path):
    if "." in path:continue
    if ["index.ipynb"] == files:continue # about 파일은 수동으로 해야한다. 경로가 다르기 때문에 
    for filename in files:
        if not filename.endswith(".ipynb"):continue # ipynb 파일만 변경한다.
            
        before_ipynb = f"{path}/{filename}" # 기존 ipynb 경로
        
        if MAX_M_DATE >= os.path.getmtime(before_ipynb):  # md 파일들 중 최근 업로드 시간보다 크면 수정이 된 상태
            continue
        before_md = before_ipynb.replace(".ipynb",".md") # 변환된 md 경로 
        
        if filename == "index.ipynb":
            after_md = before_md.replace(Before_path, Index_path) # Index.md 이동될 경로 
        else:
            after_md = before_md.replace(Before_path, After_path) # 그 외 이동될 경로 
        
        COMMAND_convert = f'jupyter nbconvert --to markdown "{before_ipynb}"' # 변환 코드
        if call(COMMAND_convert) :# 변환 실행
            print("--------------jupyter nbconvert --to markdown ERROR-------------")
            print(f"before_ipynb : {before_ipynb}\nbefore_md : {before_md}\nafter_path : {after_md}\n")
            
            
        COMMAND_mv = f'mv "{before_md}" "{after_md}"' # 이동 코드
        if call(COMMAND_mv) : # 이동 실행
            print("--------------mv ERROR-------------")
            print(f"before_ipynb : {before_ipynb}\nbefore_md : {before_md}\nafter_path : {after_md}\n")

        print(f"{after_md} 저장완료")
가장 최근 업로드 20220721 , 04:26 이므로 그 이후로 업로드 한다.
C:/Users/tkd8484/Desktop/chanp5660/blogmaker/_posts\exitem/2022-07-20-ipynb파일 블로그 업로드 자동화.md 저장완료

결론

  • 한번 클릭이 아니라 3번 클릭으로 반자동화 업로드
  • 그래도 기존의 클릭 횟수 타자를 확줄여 편의성을 증가 시켰다.