반응형

other_parameters에 있는 exif 값들은 일반적으로 아래와 같이 출력됩니다

 

Steps: 30
Sampler: Euler a
CFG scale: 6
Seed: 1234567890
Size: 1024x1536
Model hash: 7890abcdef
Model: Model_name
Denoising strength: 0.5
Clip skip: 2
Version: v9.9.9
Mask blur: 2

실제로는 줄바꿈 없이 한 줄로 출력되지만 보기 좋으라고 줄바꿈을 임의로 넣어뒀고 이렇게 줄바꿈이 포함되어서 나오는것이 목표입니다

이거는 정규 표현식을 사용할 필요 없이 나누기(split)만 사용해줘도 됩니다

그러나 other_parameters의 값들을 변경해주기 때문에 이전 글에서 작성한 key_array, value_array에 입력되는 값들을 조금 변경해줘야 합니다

 

def ExtractEXIFParameters(image):
    # 앞 내용 생략
    
    key_array = ['Prompt', 'Negative prompt']
    value_array = [positive_prompt, negative_prompt]

    other_key_array = []
    other_value_array = []
    
    for exif in other_parameters.split(','):
        exif = exif.strip()
        if ': ' in exif:
            key, value = exif.split(': ', 1)
            other_key_array.append(key)
            other_value_array.append(value)
    
    key_array += other_key_array
    value_array += other_value_array
    
    return key_array, value_array

이렇게 해준다면 맨 위에 있던 내용과 거의 비슷하게, 정확하게는 줄바꿈을 추가하고 쉼표(,)를 제거했습니다

그러나 일부 이미지의 exif는 별도의 중괄호를 이용해서 표시하기도 합니다

따라서 아래와 같이 표시되는 경우도 나올 수 있습니다

 

Steps: 30
Sampler: Euler a
CFG scale: 6
Seed: 1234567890
Size: 512x768
Model hash: 7890abcdef
Model: Model_name
Denoising strength: 0.5
Hires upscale: 2
Hires upscaler: Latent
Hashes: {"vae": "7890abcdef"
"embed:embed_name": "7890abcdef"
"lora:lora_name": "7890abcdef"
"model": "7890abcdef"}

이렇게 해도 보는데는 전혀 문제가 없지만 보기에 좋지 않습니다

이 부분은 다음에 해결해보도록 하겠습니다

 

Steps: 30, 
Sampler: Euler a,
CFG scale: 6, 
Seed: 1234567890, 
Size: 512x768, 
Model hash: 7890abcdef, 
Model: Model_name, 
Denoising strength: 0.5, 
Hires upscale: 2, 
Hires upscaler: Latent, 
Hashes: {"vae": "7890abcdef", "embed:embed_name": "7890abcdef", "lora:lora_name": "7890abcdef", "model": "7890abcdef"}

 

 

전체 코드는 아래와 같습니다

 

import re
import chardet
import piexif
from PIL import Image

def ExtractEXIFParameters(image):
    try:
        img = Image.open(image)
        img.verify()
    except(IOError, SyntaxError):
        print('This is not image file.')
        return [], []

    if (img.format == 'PNG'):
        metadata = list(img.info.values())[0]

    elif (img.format == 'JPEG'):
        # check exist exif data
        try:
            exif_dict = piexif.load(img.info['exif'])
        except:
            return [], []
        
        user_comment = exif_dict['Exif'].get(piexif.ExifIFD.UserComment)
        if user_comment:
            # remove encoding header
            metadata = user_comment[8:]

            # detecting encoding
            detected = chardet.detect(metadata)
            encoding = detected['encoding'] or 'utf-8'

            # decoding exif data
            metadata = metadata.decode(encoding, errors = 'ignore')

    else:
        print('Not support format, support *.png or *.jpg image format.')
        return [], []
    
    parameters = re.search(r'^(.*?)\nNegative prompt: (.*?)\n(.*)', metadata, re.DOTALL)
    if (parameters is not None):
        positive_prompt = parameters.group(1).strip()
        negative_prompt = parameters.group(2).strip()
        other_parameters = parameters.group(3).strip()
        
        positive_prompt = re.sub(r'\n+', ', ', positive_prompt)
        negative_prompt = re.sub(r'\n+', ', ', negative_prompt)
    else:
        return [], []

    key_array = ['Prompt', 'Negative prompt']
    value_array = [positive_prompt, negative_prompt]

    parameters = re.search(r'(.+?:) (\{.*?\}),? ?(.*)', other_parameters, re.DOTALL)
    if (parameters is not None):
        before_parameters = parameters.group(1).strip()
        inner_parameters = parameters.group(2).strip()
        after_parameters = parameters.group(3).strip()
    
        # remove {, } and " mark
        inner_parameters = re.sub(r'[{}"]', '', inner_parameters)
        for prompt in before_parameters.split(', '):
            if (': ' in prompt):
                key, value = prompt.split(': ', 1)
                key_array.append(key.strip())
                value_array.append(value.strip())
            else:
                key_array.append(prompt.replace(':', ''))
                value_array.append(inner_parameters)
        
        for prompt in after_parameters.split(', '):
            if (': ' in prompt):
                key, value = prompt.split(': ', 1)
                key_array.append(key.strip())
                value_array.append(value.strip())

    else:
        for prompt in other_parameters.split(', '):
            if (': ' in prompt):
                key, value = prompt.split(': ', 1)
                key_array.append(key.strip())
                value_array.append(value.strip())
    
    return key_array, value_array

image = './image_file.png'
keys, values = ExtractEXIFParameters(image)

for key, value in zip(keys, values):
    print(key + ': ' + value)

여기까지 했다면 기능적으로 부족함은 없을겁니다

다만 이 코드를 다른 기기에서 실행하기 위해서는 Python을 설치하고, 라이브러리도 설치하고 꽤나 번거롭고 특히 모바일 기기가 이에 해당합니다

그래서 웹 사이트를 만들고 Docker 이미지로 만들고 홈 서버를 이용해서 어디에서나 EXIF를 추출할 수 있도록 하겠습니다

반응형
반응형

이미지 파일이 아닌 경우를 걸러내주도록 하겠습니다

 

def ExtractEXIFParameters(image):
    try:
        img = Image.open(image)
        img.verify()
    except(IOError, SyntaxError):
        print('This is not image file.')
        return [], []
        # 이하 내용 동일

예외문(try, except)을 사용해서 이미지 파일이 아니거나 손상된 이미지 파일들은 예외문으로 실행됩니다

여기에는 docx 파일과 같이 이미지 파일이 아닌 파일들의 확장자를 이미지 파일 확장자인 png로 변경한 것도 해당됩니다

하지만 여전히 png 파일만 가능한데 이것을 다른 확장자명으로도 가능하도록 변경해보겠습니다

 

import chardet # 5.2.0
import piexif # 1.1.3

# 중간 내용 생략

def ExtractEXIFParameters(image):
    # 중간 내용 생략
    if (img.format == 'PNG'):
        metadata = list(img.info.values())[0]

    elif (img.format == 'JPEG'):
        # check exist exif data
        try:
            exif_dict = piexif.load(img.info['exif'])
        except:
            return [], []
        
        user_comment = exif_dict['Exif'].get(piexif.ExifIFD.UserComment)
        if user_comment:
            # remove encoding header
            metadata = user_comment[8:]

            # detecting encoding
            detected = chardet.detect(metadata)
            encoding = detected['encoding'] or 'utf-8'

            # decoding exif data
            metadata = metadata.decode(encoding, errors = 'ignore')

    else:
        print('Not support format, support *.png or *.jpg image format.')
        return [], []

이미지 포맷으로 png인지 jpg인지 확인하고 각 포맷에 맞는 방식으로 진행하면 됩니다

png는 그대로 출력해도 문제가 없지만 jpg는 인코딩을 별도로 설정해줘야 하는데 자동 인코딩을 설정하도록 chardet를 사용했습니다

여기까지 하게 된다면 전체적인 코드는 아래와 같을겁니다

 

import re
import chardet
import piexif
from PIL import Image

def ExtractEXIFParameters(image):
    try:
        img = Image.open(image)
        img.verify()
    except(IOError, SyntaxError):
        print('This is not image file.')
        return [], []

    if (img.format == 'PNG'):
        metadata = list(img.info.values())[0]

    elif (img.format == 'JPEG'):
        # check exist exif data
        try:
            exif_dict = piexif.load(img.info['exif'])
        except:
            return [], []
        
        user_comment = exif_dict['Exif'].get(piexif.ExifIFD.UserComment)
        if user_comment:
            # remove encoding header
            metadata = user_comment[8:]

            # detecting encoding
            detected = chardet.detect(metadata)
            encoding = detected['encoding'] or 'utf-8'

            # decoding exif data
            metadata = metadata.decode(encoding, errors = 'ignore')

    else:
        print('Not support format, support *.png or *.jpg image format.')
        return [], []
    
    parameters = re.search(r'^(.*?)\nNegative prompt: (.*?)\n(.*)', metadata, re.DOTALL)
    if (parameters is not None):
        positive_prompt = parameters.group(1).strip()
        negative_prompt = parameters.group(2).strip()
        other_parameters = parameters.group(3).strip()
        
        positive_prompt = re.sub(r'\n+', ', ', positive_prompt)
        negative_prompt = re.sub(r'\n+', ', ', negative_prompt)
        
        key_array = ['Prompt', 'Negative prompt', 'Other parameters']
    	value_array = [positive_prompt, negative_prompt, other_parameters]
        
        return key_array, value_array
    else:
        return [], []

image = './image_file.jpg'
keys, values = ExtractEXIFParameters(image)

for key, value in zip(keys, values):
    print(key + ': ' + value + '\n')

그러나 여전히 출력된 exif가 보기 좋지 않다는 문제점이 있습니다

이 부분은 다음에 해결해보도록 하겠습니

반응형
반응형

Stable Diffusion으로 생성한 이미지의 프롬프트(EXIF) 를 확인하려면 Python의 pillow 라이브러리를 사용해야 합니다

pip install pillow

다른 라이브러리들과 같이 사용하는 경우 모든 라이브러리들의 출시 일자를 거의 비슷하게 맞춰주는 것이 오류가 발생할 확률을 줄이는데 도움이 됩니다

필자의 경우 250102에 나온 11.1.0 버전을 사용했습니다

 

출시 일자와 버전은 아래의 페이지에서 확인할 수 있습니다

https://pypi.org/project/pillow/#history

import re
from PIL import Image

필요한 라이브러리들을 가져옵니다

re 라이브러리는 정규 표현식(Regular Expressions) 을 줄인것입니다

프롬프트를 추출하는데 사용합니다

 

def ExtractEXIFParameters(image):
    img = Image.open(image)
    metadata = list(img.info.values())[0]
    print(metadata)

image = './image_file.png'
ExtractEXIFParameters(image)
# {문자열}\nNegative prompt: {문자열}\nSteps: {숫자}, Sampler: {문자열}, CFG scale: {숫자}, 이하 생략

사용하기 편하도록 함수로 만들어줍니다

실행하면 주석에 나온것과 비슷하게 출력될겁니다

만약에 아무것도 출력되지 않는다면 둘 중 하나입니다: png 이미지가 아니거나, 해당 이미지에 EXIF가 없거나

이렇게만 해도 다 확인할 수 있지만 보기에는 상당히 좋지 않습니다

그래서 보기 좋게 바꿔주도록 하겠습니다

 

나누려고 하는데 어디를 기준으로 해야할지 정하기 어렵습니다

필자의 경우 일단은 Prompt, Negative prompt, 그 이외의 값 이렇게 셋으로 나누려고 합니다

Negative prompt에서 항상 있는 문자열은 '\nNegative prompt: ' 가 해당됩니다

그러면 이 문자열을 기준으로 나눈다면 값을 쉽게 나눌 수 있을것입니다

def ExtractEXIFParameters(image):
    # print() 함수를 제외한 이전 코드 이어서 작성
    parameters = re.search(r'^(.*?)\nNegative prompt: (.*?)\n(.*)', metadata, re.DOTALL)
    if (parameters is not None):
        positive_prompt = parameters.group(1).strip()
        negative_prompt = parameters.group(2).strip()
        other_parameters = parameters.group(3).strip()
        
        positive_prompt = re.sub(r'\n+', ', ', positive_prompt)
        negative_prompt = re.sub(r'\n+', ', ', negative_prompt)
        
        key_array = ['Prompt', 'Negative prompt', 'Other parameters']
    	value_array = [positive_prompt, negative_prompt, other_parameters]
        
        return key_array, value_array
    else:
        return [], []

문자열을 나누기 위해서 정규 표현식을 사용했습니다

정규 표현식과 관련해서는 아래의 글들을 보시면 도움이 될겁니다

 

re.search() 함수 https://docs.python.org/3/library/re.html#re.Pattern.search

re.sub() 함수 https://docs.python.org/3/library/re.html#re.Pattern.sub

08-1 정규 표현식 살펴보기 https://wikidocs.net/1642
08-2 정규 표현식 시작하기 https://wikidocs.net/4308
08-3 강력한 정규 표현식의 세계로 https://wikidocs.net/4309

 

위의 글들을 봐도 이해가 잘 안간다면 ChatGPT, Claude와 같은 LLM을 사용하시는걸 추천드립니다

 

이미지에 EXIF가 있다면 parameters에 어떤 값이 들어있게 됩니다

그러면 if() 문은 True가 되어서 실행이 되고 positive_prompt, negative_prompt, other_parameters에 각각에 해당하는 값들이 들어가게 됩니다

만약에 이미지에 EXIF가 없다면 parameters에 어떠한 값도 없어서 if() 문은 False가 되어서 else를 실행하게 됩니다

이 경우에는 이미지에 EXIF가 없기 때문에 빈 배열 2개를 반환해줍니다

 

추가로 가끔 Prompt, Negative prompt에 줄바꿈(\n) 이 있는 경우도 있습니다

Stable Diffusion에서 줄바꿈은 쉼표(, ) 와 동일하게 작동하므로 이를 바꿔주기 위해서 마찬가지로 정규 표현식을 사용해줬습니다

image = './image_file.png'
keys, values = ExtractEXIFParameters(image)

for key, value in zip(keys, values):
    print(key + ': ' + value)

다 입력했으면 한번 실행해봅니다

실행하면 Prompt, Negative prompt, 그 외 기타 값 이렇게 셋으로 나눠져서 잘 출력됩니다

import re
from PIL import Image

def ExtractEXIFParameters(image):
    img = Image.open(image)
    metadata = list(img.info.values())[0]
    
    parameters = re.search(r'^(.*?)\nNegative prompt: (.*?)\n(.*)', metadata, re.DOTALL)
    if (parameters is not None):
        positive_prompt = parameters.group(1).strip()
        negative_prompt = parameters.group(2).strip()
        other_parameters = parameters.group(3).strip()
        
        positive_prompt = re.sub(r'\n+', ', ', positive_prompt)
        negative_prompt = re.sub(r'\n+', ', ', negative_prompt)
        
        key_array = ['Prompt', 'Negative prompt', 'Other parameters']
    	value_array = [positive_prompt, negative_prompt, other_parameters]
        
        return key_array, value_array
    else:
        return [], []

image = './image_file.png'
keys, values = ExtractEXIFParameters(image)

for key, value in zip(keys, values):
    print(key + ': ' + value)

전체적인 코드는 위와 같습니다

이렇게 하면 Stable Diffusion으로 생성한 이미지의 EXIF를 출력할 수 있습니다

다만 몇 가지 문제점이 있습니다

 

1. png 이미지만 사용 가능

2. 예외문이 없어서 오류가 발생할 수 있음(이미지 파일이 아닌 다른 파일을 넣었을 때 등)

3. 출력된 exif가 보기 좋지 않음

 

이 부분들은 다음에 해결해보도록 하겠습니다

반응형
반응형

필자가 사용한 라이브러리의 버전과 날짜는 다음과 같습니다

Python 3.13.1, 241203
chardet 5.2.0, 230802
piexif 1.1.3, 190702
pillow 11.1.0, 250102

 

1. Stable Diffusion으로 생성된 이미지 EXIF 추출하기(1)

 

Stabel Diffusion으로 생성된 이미지를 웹 페이지에 넣으면 해당 이미지의 EXIF를 출력하게 하려 합니다

 

반응형
반응형

아래 소제목을 클릭하면 해당 부분으로 이동합니다

 


 

문자열에는 문자가 있는것들이 해당합니다

# 1. 작은 따옴표로 문자열을 감싸는 방법
'Hello Python'

# 2. 큰 따옴표로 문자열을 감싸는 방법
"Hello Python"

# 3. 작은 따옴표 3개로 문자열을 감싸는 방법
'''Hello Python'''

# 4. 큰 따옴표 3개로 문자열을 감싸는 방법
"""Hello Python"""

위와 같은 방식들로 사용 가능합니다

작은/큰 따옴표 1개 안에 문자열 넣기, 작은/큰 따옴표 3개 안에 문자열 넣기, 총 4가지의 방법이 있는데 괜히 4가지의 방법이 있는것이 아니고 각각 용도에 맞게끔 사용하면 됩니다

 


 

만약에 입력하는 문자열 중간에 같은 따옴표('를 썼으면 ' 또는 "를 썼으면 ") 가 들어가 있다면 어떻게 될까요?

a = 'This laptop's CPU is intel N100'

입력 문자열 중간에 작은 따옴표가 들어가있고 이것을 입/출력해보도록 하겠습니다

과연 아무런 문제 없이 입/출력이 될까요?

 

SyntaxError: invalid syntax 라는 오류가 나오면서 입력조차도 안됩니다

잘 쓴거 같은데 왜 안될까요?

 

문자열을 작은 따옴표로 감싸준 다음에 중간에 작은 따옴표가 들어가서 파이썬은 중간에 문장이 끊긴것으로 인식합니다

따라서 필자가 위에서 작성한 코드를 실제로 파이썬은 이런식으로 인식합니다

a = 'This laptop'

이미 다 입력해놨는데 뒤에 알 수 없는 추가적인 문자열들이 있으니 오류가 발생하는 것입니다

 

이 문제를 해결할 방법이 몇가지가 있는데 그 중 4가지 소개하도록 하겠습니다

# 1. 큰 따옴표로 문자열을 감싸는 방법
a = "This laptop's CPU is intel N100"

# 2. 작은 따옴표 3개로 문자열을 감싸는 방법
a = '''This laptop's CPU is intel N100'''

# 3. 큰 따옴표 3개로 문자열을 감싸는 방법
a = """This laptop's CPU is intel N100"""

# 4. 역슬래시(\) 를 사용하는 방법
a = 'This laptop\'s CPU is intel N100'

4가지 방법 모두 잘 됩니다

 

어느것을 사용해도 되지만 개인적으로는 4번 방법을 가장 많이 사용합니다

대단한 이유는 없고 1~3번 방법은 큰 따옴표를 입력할 때 Shift + 따옴표 기호를 입력, 따옴표 기호를 3개 입력해야 하는 번거로움이 있지만

4번 방법은 중간에 역슬래시(\) 만 추가해주면 되기 때문입니다

 

 

 

따옴표를 구분해서 사용하면 아래와 같은 문장을 출력할 때 도움이 됩니다

# Oppenheimer said, 'Now I Am Become Death, the Destroyer of Worlds.' 출력하기
a = "Oppenheimer said, 'Now I Am Become Death, the Destroyer of Worlds.'"
print(a)

 


 

따옴표를 구분해서 사용하면 아래와 같은 문장을 출력할 때 도움이 됩니다

a = '''
1 year = 365 days
1 day = 24 hours
1 hour = 60 minutes
1 minute = 60 seconds
'''
print(a)

 

여러줄의 문자를 출력하는 방법에는 따옴표를 3개 사용하는 방법 말고 \n(줄 바꿈) 을 사용해도 됩니다

a = '1 year = 365 days\n1 day = 24 hours\n1 hour = 60 minutes\n1 minute = 60 seconds'
print(a)

다만 위의 코드처럼 줄 바꿈을 하지 않은채로 코드를 작성하면 가독성이 매우 떨어지기 때문에 별로 추천하는 방법은 아니고 이런식으로도 작성할 수 있구나 하고 넘어가면 됩니다

 

이스케이프(Escape) 문자(또는 이스케이프 코드) 이며 이스케이프 문자는 아래와 같습니다

항목 설명
\n 문자열 안에서 줄 바꿀 때 사용
\t 문자열 안에서 탭 간격을 맞출 때 사용
\\ 역슬래시(\) 를 출력할 때 사용
\' 작은 따옴표(') 를 출력할 때 사용
\" 큰 따옴표(") 를 출력할 때 사용

위의 5종류 외에도 더 있기는 하지만 그 외에는 많이 사용하지 않기 때문에 넣지 않았습니다

 


 

문자열도 연산이 가능은 합니다

다만 더하고 곱하는 기능만 가능합니다

a = 'Python is '
b = 'good '
c = 'bad '
d = 'language'
e = 3

print(a + b + d)
print(a + c + d)
print(b * 3)

문자열에 문자열을 더하면 이어 쓰기가 되고

문자열에 숫자를 곱하면 해당 문자열을 곱한 숫자만큼 반복하게 됩니다

 


 

문자열의 길이를 구할때는 len() 을 사용합니다

위의 예제를 조금만 수정해보겠습니다

a = 'Python is '
b = 'good '
# c = 'bad '
d = 'language'
# e = 3

print(a + b + d)
len(a + b + d)

길이가 23, 즉 23자의 글자가 있다는 뜻이고 이는 띄어쓰기(Space) 를 포함한 값입니다

반응형
반응형

제목을 저렇게 써 둔 이유는 변수에는 숫자만 있는것이 아니기 때문에 그렇습니다

숫자형 자료 안에서도 정수, 소수로 또 나뉘고 그 안에서 또 나뉩니다

 

먼저 정수가 뭐고 실수가 뭔지 보겠습니다

항목 예시
정수형 -273, -6, 4, 87, 255
실수형 -123.456, 1.414, 3.141592

정수형은 말 그대로 정수(Integer) 를 의미하고

실수는 소수점이 포함된 숫자(Floating-Point) 를 의미합니다

 

변수 a에 -273을 대입하고 난 뒤 출력하고 타입을 확인한 것입니다

타입에는 정수형(int) 라고 나옵니다

 

마찬가지로 변수 a에 3.141592를 대입하고 난 뒤 출력하고 타입을 확인한 것입니다

타입에는 실수형(float) 라고 나옵니다

 

 

 

다음으로 볼거는 진법입니다

항목 예시
2진법 0b11111111
8진법 0o377
10진법 255
16진법 0xFF

진법은 위와 같이 4종류로 구분되고 각 숫자를 10진수로 변환하면 255가 나옵니다

 

2진수는 0과 1만(총 2종류)

8진수는 0부터 7까지만(총 8종류)

10진수는 0부터 9까지만(총 10종류)

16진수는 0부터 9까지와 A부터 F까지(총 16종류)

를 사용하게 됩니다

 

8진수 같은 경우에는 실제로 쓴 적이 거의 없어서 '아 8진수는 이렇게 쓰는거구나' 하고 넘기시면 됩니다

 

 

 

또한 파이썬은 아주 크거나 작은 숫자도 넣을 수 있습니다

1e-5(0.00001), 1e+3(1,000) 과 같이 숫자를 나타내는 방법을 과학적 표기법(Scientific Notation) 또는 지수 표기법(Exponential Notaion)이라고 합니다

이렇게 숫자를 나타내는 이유는 아주 큰 숫자나 아주 작은 숫자를 쓰기에 더 편하기 때문에 사용하는 것입니다

만약에 아주 작은 숫자, 그러니까 0.0000000001 쓴다면 0이 몇개인지 세고 있겠지만 과학적 표기법을 사용한다면 1e-10과 같이 더 간단하고 보기 쉽게 사용할 수 있습니다

 

과학적 표기법을 이용해 1,500,000,000(15억) 을 쓴다면 1.5e+9와 같이 사용하면 됩니다

 

 

 

숫자니까 사칙 연산도 가능합니다

a = 2
b = 10
c = 3

변수 몇가지를 입력하고 계산하겠습니다

 

print(a + b)

더하기는 +을 사용하며 두 수를 더하게 됩니다

계산 결과는 2 + 10을 해서 12가 나옵니다

 

print(a - b)

빼기는 -을 사용하며 두 수를 빼게 됩니다

계산 결과는 2 - 10을 해서 -8이 나옵니다

 

print(b / c)

나누기는 /을 사용하며 두 수를 나눕니다

정수로 나눠 떨어지지 않는 값은 소수점으로 표기됩니다

계산 결과는 10 / 3을 해서 3.33이 나옵니다

 

print(b // c)

몫을 //을 사용하며 두 수를 나눈 몫을 보여줍니다

계산 결과는 10 // 3을 해서 몫 3이 나옵니다

 

print(b % c)

나머지는 %을 사용하여 두 수를 나눈 나머지를 보여줍니다

계산 결과는 10 % 3을 해서 나머지 1이 나옵니다

 

print(a * b)

곱하기는 *을 사용하여 두 수를 곱합니다

계산 결과는 2 * 10을 해서 20이 나옵니다

 

print(a ** b)

제곱은 **을 사용해서 두 수의 제곱을 보여줍니다

계산 결과는 2 ** 10을 해서(2를 10번 곱함) 1024가 나옵니다

반응형
반응형

파이썬 코드를 작성하는 프로그램에는 여러가지가 있는데 그 중 몇가지만 알아볼까 합니다

아래 목차는 클릭하면 해당 부분으로 이동합니다

 

  1. 메모장(Notepad)
  2. IDLE
  3. Notepad++
  4. Visual Studio Code

 

1. 메모장(Notepad)메모장(Notepad)

윈도우에 있는 메모장 맞습니다

메모장을 열어줍니다

 

메모장이 열리면 아래와 같이 입력해줍니다

print('Hello Python')

다 썼으면 저장해줍니다

 

저장할 때 파일 이름은 아무거나 해도 상관 없지만 띄어쓰기(Space Bar) 가 없게끔 해두시면 됩니다

띄어쓰기가 필요한 경우에는 언더바(_) 를 사용하면 되고

하단의 파일 형식(T) 을 텍스트 문서(*.txt) 에서 모든 파일(*.*) 로 변경하고 확장자(*.py) 까지 붙여서 저장해줘야 합니다

저는 hello_python.py로 저장해두겠습니다

 

저장을 했으면 cmd를 열어줍니다

 

cmd에 아래와 같이 입력해줍니다

cd C:\Users\[윈도우 계정 이름]\Downloads
python hello_python.py

저는 다운로드 경로에 hello_python.py를 저장해뒀기 때문에 디렉토리를 다운로드로 이동한 것입니다

다른 경로에 저장을 해뒀다면 해당 경로로 이동하면 되고

마찬가지로 파일 이름도 다르게 저장하셨다면 그 파일 이름을 쓰면 됩니다

 

2. IDLE

파이썬을 설치할 때 기본적으로 설치되는 프로그램입니다

 

idle을 찾아서 실행해줍니다

 

File → New File을 눌러서 새 파일을 작성해줍니다

아니면 단축키인 Ctrl + N을 눌러도 됩니다

 

새 창이 열리면 아래와 같이 입력해줍니다

print('Hello Python')

다 썼으면 저장해줍니다

 

저장을 완료했으면 Run → Run Module을 눌러서 실행해줍니다

 

만약에 저장하지 않은 상태로 실행하려고 하면 먼저 저장을 하라고 하는 안내창이 뜨니 반드시 저장을 먼저 해주고 실행해주기 바랍니다

 

실행하면 마찬가지로 별 문제없이 잘 나옵니다

 

3. Notepad++

Notepad++ 사이트에 들어가줍니다

https://notepad-plus-plus.org/downloads/

 

Downloads | Notepad++

 

notepad-plus-plus.org

 

다운르도를 해주고 설치도 해줍니다

 

설치는 모두 기본값으로 해주면 됩니다

 

실행되면 이런 내용이 나올건데 닫아줍니다

 

안 해줘도 되기는 하는데

언어(L) → P → Python 을 선택해줍니다

 

아래와 같이 입력해줍니다

print('Hello Python')

저장해주고 실행하는 부분은 1. 메모장(Notepad) 의 마지막을 참고하시면 되겠습니다

 

4. Visual Studio Code

아래 사이트에 접속해줍니다

https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

윈도우 환경에서 사용할 것이니까 Windows를 선택하면 됩니다

 

좌측의 Extensions를 클릭합니다

 

Python을 찾아줍니다

 

Install 을 눌러서 설치해줍니다

 

설치를 완료했으면 File → New File... 을 눌러서 새 파일을 작성해줍니다

 

언어를 선택하라고 합니다

굳이 선택하지 않아도 몇줄 작성하면 문법을 보고 어느 언어를 사용했는지 유추하기는 하지만

지금 쓸 코드는 한줄짜리 코드라서 제대로 동작하지 않을수도 있기 때문에 지정을 해주도록 하겠습니다

 

아래와 같이 입력해줍니다

print('Hello Python')

 

저장해주고 실행하는 부분은 1. 메모장(Notepad) 의 마지막을 참고하시면 되겠습니다

반응형

'Python > Python 기초' 카테고리의 다른 글

5. 변수 - 문자열 자료형(1)  (1) 2023.09.20
4. 변수 - 숫자형 자료형  (0) 2023.09.20
2. 시스템 환경 변수에 Python 직접 추가하기  (0) 2023.09.13
1. Python 설치하기  (1) 2023.09.13
반응형

사실 이 부분은 필수는 아니지만 설치 단계에서 Add PATH에 체크를 하지 않고 설치한 경우 해결 방법에 대해 작성한 것입니다

 

시스템 환경 변수 편집을 찾아줍니다

 

환경 변수(N)... 를 눌러줍니다

 

많이 있는데 다른건 볼거 없고

윗쪽에 있는 Path 부분을 더블클릭 해주면 됩니다

 

아랫쪽에 해주면 윈도우에 로그인 할 수 있는 모든 계정들에 적용되고

윗쪽에 해주면 현재 로그인한 윈도우 계정에만 적용됩니다

기본값은 현재 로그인한 윈도우 계정, 즉 윗쪽입니다

 

들어가면 이런식으로 나올겁니다

 

아랫줄을 더블클릭하면 입력할 수 있는 공간이 나옵니다

 

입력해 줄 경로는 아래와 같습니다

C:\Users\[윈도우 계정 이름]\AppData\Local\Programs\Python\Python39\
C:\Users\[윈도우 계정 이름]\AppData\Local\Programs\Python\Python39\Scripts\

입력을 해줬으면 우측 하단의 확인을 눌러서 적용을 해주면 됩니다

 

이건 설치 부분에도 있는 내용인데 정상적으로 적용이 되었는지 확인을 해보겠습니다

cmd를 열어줍니다

 

cmd에 아래와 같이 입력해줍니다

python --version

입력을 하게 되면 현재 시스템에 설치된 파이썬의 버전이 나옵니다

 

 

 

추가로 왜 시스템 환경 변수에 추가를 해야하는지도 알아보겠습니다

이를 알아보기 위해서는 시스템 환경 변수에서 파이썬과 관련된 내용들을 모두 제거해야합니다

 

모두 제거된 상태입니다

이 상태로 똑같이 cmd를 열어서 파이썬의 버전을 확인해보면 어떤게 나올까요?

 

좀전까지만 해도 파이썬의 버전을 잘 보여줬는데 갑자기 안됩니다

그러면 시스템 환경 변수를 쓰지 않고 파이썬을 어떻게 실행해야 할까요?

 

파이썬이 설치된 경로로 직접 들어가서 실행해줘야 하고 설치 경로는 아래와 같습니다

C:\Users\[윈도우 계정 이름]\AppData\Local\Programs\Python\Python39\

들어가면 이런식으로 나옵니다

cmd를 열고 아래와 같이 입력해줍니다

cd C:\Users\[윈도우 계정 이름]\AppData\Local\Programs\Python\Python39\
python --version

했더니 이제 정상적으로 파이썬의 버전이 나옵니다

 

위의 과정은 파이썬이 설치된 경로로 디렉토리를 변경한 다음 파이썬을 실행한 것입니다

그러나 cmd를 닫으면 다시 디렉토리를 변경하고 프로그램을 실행해야 하는 번거로움이 있기 때문에

시스템 환경 변수에 넣어서 사용하는 것입니다

반응형

'Python > Python 기초' 카테고리의 다른 글

5. 변수 - 문자열 자료형(1)  (1) 2023.09.20
4. 변수 - 숫자형 자료형  (0) 2023.09.20
3. 코딩 프로그램 설치와 사용  (0) 2023.09.15
1. Python 설치하기  (1) 2023.09.13
반응형

https://www.python.org/ 에 들어가줍니다

 

위에 보이는 Downloads를 클릭해줍니다

아니면 여기에 들어가도 됩니다

 

여러가지 버전을 다운로드/설치 할 수 있도록 나와있습니다

 

아래로 내려줍니다

 

내리다 보면 Looking for a specific release? 라는 부분이 있고 여기에서 원하는 버전을 찾으면 됩니다

어느 버전을 선택해도 무방하지만 저는 3.9.6을 설치할 것이니 3.9.6을 찾은 다음 Download를 클릭해줍니다

 

아래로 쭉 내리면 Files라는 부분이 나오고 설치 파일을 다운로드 하는 부분이 나옵니다

윈도우에서 실행할 것이니까 Windows Installer을 선택하면 되고

대부분은 64비트를 사용하므로 (64-bit) 를 선택하면 됩니다

 

다운로드를 완료했으면 설치를 해줍니다

설치는 크게 어렵지 않지만 하단의 Add Python 3.9 to PATH 는 체크해주고 설치해줍니다

(설치하는 파이썬 버전에 따라 숫자 또는 레이아웃이 다르게 나올 수 있으나 대부분은 비슷합니다)

이걸 해주지 않으면 시스템 환경 변수에서 별도로 추가해줘야 하고 매번 파이썬을 실행할 때 마다 더 번거롭게 실행하게 됩니다

혹여나 Add Python 3.9 to PATH 체크를 하지 않고 설치하신 분들은 여기에 나온 방법대로 하시면 되겠습니다

 

다 했으면 Install Now를 클릭해줍니다

 

설치는 오랜 시간이 걸리지 않고 끝납니다

 

설치가 정상적으로 되었는지 확인도 해봐야겠지요?

cmd를 열어줍니다

 

cmd에 아래와 같이 입력해줍니다

python --version

 

입력을 하게 되면 현재 시스템에 설치된 파이썬의 버전이 나옵니다

반응형

+ Recent posts