라즈베리파이의 파이썬 파일을 여러개 동시에 실행하고 싶습니다.

라즈베리파이에 파이썬파일을 여러개 구동하고싶습니다.
그래서 01py&로 백그라운드로 돌린다음 다른 파일을 실행해봤더니

소켓이 이미 사용중이라고 오류가 납니다.
현재 01py에는 포트5000번 flask 웹서버가 작동중입니다.
02py에는 메일서버가 들어가 있습니다.
그리고 포트8080에 영상서버가 돌고있습니다.

영상서버와 다른 서버들을 같이 실행하면 전혀 문제가없지만
영상서버에 flask 웹서버와 메일서버를 같이 돌릴려면

socket.error: [Errno 98] Address already in use
가 발생합니다.

이 세가지를 어떻게 한번에 돌릴까요?
영상서버는 백그라운드에서 문제없이 계속돌아서
01py와 02py코드를 하나로 통합하고 싶어도 어떻게 할지 모르겠네요.
02py내용을 01py의 @app.route의 어디에 넣을지 모르겠습니다.

01py 내용입니다.
from flask import Flask
~
~
app = Flask(__name__)

@app.route('/')
def index():
	return 'cju'

@app.route('/lcd01')
def lcd_01():
	lcd.clean()
	lcd.lcd_display_string("test01",1)
	return 'lcd01'
~
~
if __name__ == '__main__':
	app.run(debug=True, host='0.0.0.0')
02py입니다.
import RPi.GPIO as GPIO
from subprocess import call
import I2C_LCD
from email. MIMEMultipart import ~
import os
~
def sendmail()
	server.sendmail()~
~
try:
	while True:
		lcd.~
		sendmail()

도와주세요/

웹메일은 구글을 사용하고 있습니다. 백그라운드에 02py인 버튼 눌렀을때 메일보내는 것을 돌리고 01py을 돌리면 바로는 문제가 발생하지않지만 버튼누르고 메일전송시도에서 라즈베리파이가 멈춰버리고 서버가 가 닫힙니다.

socket.error: [Errno 98] Address already in use

만 보면 중복 포트 문제로 보입니다.

01py에서 쓰는 포트와
02py에서 쓰는 포트를 비교해봐야겠네요.

그런데, 01py와 02py를 따로따로 실행시켰을 때 문제가 없고,
02py의 내용을 01py에 옮겼을 때 문제가 생긴다면, 잘못된 함수 호출로 같은 port에 bind를 두 번 하는 문제 같습니다.

그럼 포트만 변경해보겠습니다. 02py의 내용을 01py에 넣고 싶은데, 형식이 @app.route(’~’)
def index():

이렇게 특정 페이지에 접속하면 작동되는 방식이라 어떻게 넣을지 모르겠습니다.

02py는 계속 대기하다가 버튼을 누르면 메일을 보내는 형식이라 항시 작동해야될거같은데 그냥
@app.route(’/’)에 넣어도 될까요?

01py의 5000번 서버
02py의 메일서버
그리고 02py에 있는지? 아니면 다른 py에 있는지 모르는 영상서버
모두 서로 다른 역할인데, 굳이 01py에 다 넣어야하나요? 이 부분을 먼저 생각을 하셨으면 좋겠어요.

아무튼 필요하다고 하셨으니…
01py의 5000번 서버는 기본적으로 HTTP에 의하여 동작하고,
02py의 메일 서버는 SMTP에 의하여 동작하잖아요?

그런데 01py의

@app.route('/')
def index():
	return 'cju'

와 같은 코드는 http:127.0.0.1:5000/를 호출했을 때, 어떤 내용을 응답할 것인가를 결정하는 내용이고요.
즉, SMTP와는 전혀 연관이 없져.
따라서 01py에서 메일서버를 돌리고 싶으시다면,

if __name__ == '__main__':
	app.run(debug=True, host='0.0.0.0')
       //여기에서 메일 서버를 구동합니다. 멀티스레들르 사용하든 fork을 사용하든 어찌 되었든요.

그리고

@app.route('/sendmail')
def sendmail():
        // 이곳에서 main에 동작한 메일 서버에 다시 값을 쏩니다.
	return 'cju'
1 Like

감사합니다. flask 포트를 8282로 변경해보았으나 전부 잘작동되는데 막상 8282로 들어가려하니 연결거부가 뜹니다.
01py에 안넣는다면 제가 아는 방식인 python ~.py&로 백그라운드로 돌리면서 여러개 실행하는게 맞나요?

알려주신대로 넣어보겠습니다.
@app.route(’/sendmail’) 아래로
sendmail 내용을 넣어도

if name ==~
아래에 작성한 버큰 클릭시 sendmail()불러오는걸 넣으라는 말씀이 맞나요?
해보겠습니다. 감사합니다.

감사합니다. flask 포트를 8282로 변경해보았으나 전부 잘작동되는데 막상 8282로 들어가려하니 연결거부가 뜹니다.

이 부분은 방화벽 관련 설정을 살펴보시겠어여? app으로 8282를 열더라도 방화벽이 막혀있으면, 연결 거부가 뜨는게 맞습니다.

01py에 안넣는다면 제가 아는 방식인 python ~.py&로 백그라운드로 돌리면서 여러개 실행하는게 맞나요?

넵. 어찌 되었든 서로 독립된 서비스니까여

알려주신대로 넣어보겠습니다.
@app.route(’/sendmail’) 아래로
sendmail 내용을 넣어도

if name ==~
아래에 작성한 버큰 클릭시 sendmail()불러오는걸 넣으라는 말씀이 맞나요?
해보겠습니다. 감사합니다.

힘내세용.

내부망에서 돌아가는중인데 제가 라즈베리파이를 처음 만져봐서 방화벽이라는게 라즈베리파이쪽을 말씀하시는건지 알수 있을까요? 아니면 pc의 방화벽에서 막아도 "192.~에서 연결을 거부했습니다"가 뜨나요?

라즈베리파이쪽 방화벽이염. pc의 방화벽은 따로 신경쓰지 않으셔도 될거에여

많은 지식배워갑니다.
찾아서 열어보겠습니다.

감사합니다! 말씀하신대로 포트변경후 포트개방 문제를 해결하였습니다.
라즈베리를 만져보는것도 처음이고 파이썬도 잘모르고 리눅스만 조금 만져봐서 겨우 진행하던차에 막혀서 막막했었습니다. 감사합니다.

2 Likes