할로윈이니까 파이썬한테 가보라고 해.

파괴적인 처리도 아니기 때문에 기본적으로 문제가 없을 것 같지만 일단.
주: 이 글의 내용은 농담입니다.초래한 손실에 대해 일체 책임을 지지 않는다.

앞말


무의식중에 파이썬 참조를 읽고 다음과 같은 기록을 발견하였다.
sys.ps1과sys.ps2 변수는 주 프롬프트와 보조 프롬프트에 표시되는 문자열을 정의합니다.
>>>
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>
아, 힌트의 표시가 바뀌나요?이것은 이미 놀 수밖에 없다.

결론적으로 말하면


결론적으로 말하면 다음과 같은 악작극을 했다.
평소처럼 대화 환경을 가동하면 지루하다.

코드


나는 아래와 같은 각본을 썼다.
이 중 trick_init.py 을 실행하면 필요한 파일을 생성합니다.
trick_init.py
import sys, os
from exec_meta import get_info, do_cmd, write_lines_to_file

_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) + r'\trick_work'

def make_fake_python():
    real_python_path = get_info('where python')[0]
    real_python_message = '\n'.join([
        sys.version, 'Type "help", "copyright", "credits" or "license" for more information.'
    ])

    write_lines_to_file(_DIR_PATH + r'\prompt.txt',
        'hogeeeeeeeeeeeeeeeeeeeeeee ',
        'fugaaaaaaaaaaaaaaaaaaaaaaa '
    )

    write_lines_to_file(_DIR_PATH + r'\trick.py',
        'dir_path = r"{}"                            '.format(_DIR_PATH),
        'with open(dir_path + r"\\prompt.txt", "r") as f:              ',
        '    try:                                                      ',
        '        __import__("sys").ps1 = next(f).rstrip("\\n")         ',
        '        __import__("sys").ps2 = next(f).rstrip("\\n")         ',
        '    except:                                                   ',
        '        pass                                                  ',
        '                                                              ',
        'if __import__("os").path.isfile(dir_path + r"\\message.txt"): ',
        '    with open(dir_path + r"\\message.txt", "r") as f:         ',
        '        print(f.read())                                       ',
        'else:                                                         ',
        '    print("""\\\n{}""")'           .format(real_python_message),
        '                                                              ',
        'del dir_path, f                                               '
    )       

    write_lines_to_file(_DIR_PATH + r'\python.bat',
        '@echo off',
        real_python_path + r' -i {}\trick.py'.format(_DIR_PATH),
        'exit /b'
    )

def main():
    do_cmd('mkdir {} > NUL 2>&1'.format(_DIR_PATH), ignoring_error=True)
    make_fake_python()

if __name__ == '__main__':
    main()

exec_meta.py
from subprocess import check_output, check_call, call

def get_info(cmd, char_code='shift-jis'):
    return [
        b_line.decode(char_code).rstrip()
            for b_line in check_output(cmd.split(), shell=True).split('\n'.encode(char_code))
            if b_line
    ]

def do_cmd(cmd, *, ignoring_error=False):
    if ignoring_error:
        call(cmd, shell=True)
    else:
        check_call(cmd, shell=True)

def write_lines_to_file(file_path, *lines):
    with open(file_path, 'w') as f:
        f.writelines(
            map(lambda x: x + '\n', lines)
        )

엉망진창으로 쓰인 더러운 코드지만 이걸 실행하면 이 파일들을 만들 거예요.
(곳곳에 개인 정보가 숨겨져 있다)
python.bat
@echo off
C:\ProgramData\Miniconda3\python.exe -i C:\...\trick_work\trick.py
exit /b

trick.py
dir_path = r"C:\...\trick_work"                            
with open(dir_path + r"\prompt.txt", "r") as f:              
    try:                                                      
        __import__("sys").ps1 = next(f).rstrip("\n")         
        __import__("sys").ps2 = next(f).rstrip("\n")         
    except:                                                   
        pass                                                  

if __import__("os").path.isfile(dir_path + r"\message.txt"): 
    with open(dir_path + r"\message.txt", "r") as f:         
        print(f.read())                                       
else:                                                         
    print("""\
3.6.0 |Continuum Analytics, Inc.| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)]
Type "help", "copyright", "credits" or "license" for more information.""")

del dir_path, f                                               

prompt.txt
hogeeeeeeeeeeeeeeeeeeeeeee 
fugaaaaaaaaaaaaaaaaaaaaaaa 

그리고 이python.단지bat을 참조 우선도가 진짜보다 높은 곳에 두었을 뿐이다.
prompt.txt의 내용은 자유롭게 개작할 수 있다.
텍스트 편집기 따위로 마음대로 편집하면 재미있겠지.
또한 자동으로 생성되지는 않았지만 메시지.txt를 놓으면 내용을 사용합니다.
예:...
message.txt
-[------->+<]>.+[-->+<]>++.---[->+++<]>+.[->+++++<]>-.---[->++++<]>-.----.+++..+++++++.-[-->+++++<]>.------------.-[--->++<]>-.+++++++++++.+[--->+<]>.-[->+++<]>+.+[---->+<]>+++.[->+++<]>+.-[->+++<]>.-[--->++<]>.+++++.----.------.[->+++<]>-.>++++++++++.++[->++++++<]>.[--->++++<]>+.-[++>-----<]>..+++++++++.-[---->+<]>++.++++[->++<]>.[--->++++<]>+.+++++++++++..+++.++++++++.[->+++<]>..+++++++++.-[->+++++<]>.

이렇게 소탈한 정보를 표시합니다.

게임이 끝나면


python.그냥 bat 꺼.이렇게 되면 원래의 Python을 사용할 수 있게 된다.

좋은 웹페이지 즐겨찾기