.profile에서 프로그램을 실행하면 GUI startx가 차단됩니다.

.profile에서 프로그램을 실행하면 GUI startx가 차단됩니다.

라즈베리 파이에 부팅/로그인할 때 키보드를 폴링하는 Python 프로그램을 실행하고 싶습니다.

이전 시도에는 cron 작업(표준 입력 또는 표준 출력 누락으로 인해 실패)이 포함되었습니다.

rc.local또한 표준 입력이 없기 때문에 실패했습니다(영원한 루프에 갇혔습니다. 이제저것탈출은 재미있다)

그래서 명령을 .profile에 넣었는데 정말 잘 작동하는 것 같습니다! Pi가 켜지면 프로그램이 예상대로 정확하게 실행됩니다.하지만...

GUI를 통해 부팅하려고 하면 startx화면이 검게 변하고 전혀 부팅되지 않습니다. 이는 Ppython 프로그램과 관련된 것 같습니다. bash.profile에서 이를 제거하면 모든 것이 잘 작동하기 때문입니다.

어떤 도움이라도 대단히 감사하겠습니다!

고쳐 쓰다

LED(간단한 빨간색-노란-녹색 시퀀스)에도 출력하는 스크립트를 만들었고 .profile이 실행되는 것으로 나타납니다.다시언제 startx실행되나요? 그렇다면 왜?

아래는 내 .profile 코드이고 내 Python 프로그램은 다음과 같습니다. Python 스크립트의 요점은 다음과 같습니다.영원히 반복되는 stdin/keyboard에 의해 종료된 스레드를 실행합니다.

.등고선

echo "About to run keyboard polling"; sleep 3
python /home/pi/poll_keyboard.py

poll_keyboard.py

import thread
import time
def input_thread(L):
    key = raw_input()
    L.append(key)
    thread.exit() #Should close thread at end
def do_print():
    L = []
    thread.start_new_thread(input_thread, (L,))
    i = 0
    while True:
        print "Hello World %d" % i
        if L: #If anything has been detected
            break
        i += 1
        time.sleep(0.5)
    return L
key = do_print()
print "Key press detected: %s. Exiting in 2" % key
time.sleep(2)
exit()

답변1

여기서 일어나는 일은 명령줄에서 시작한 다음 startx준비가 되면 호출하는 것입니다. 경험상 GUI가 재실행을 시도 .profile하고 Python 스크립트가 종료되지 않아 GUI가 중단된다고 가정합니다.

시도해 볼 만한 한 가지 솔루션은 코드가 한 번만 실행되도록 환경 변수를 설정하는 것입니다.

# This is .profile
#
if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}"
then
    # Protected code here will be called only once
    #
    echo "About to run keyboard polling"; sleep 3
    python /home/pi/poll_keyboard.py

    export DONE_PROFILE="${USER:-unknown}"
fi

또 다른 옵션은 다음과 같은 경우에만 코드를 호출하는 것입니다.표준 입력터미널에 연결:

# This is .profile
#
if test -t 0 -a -t 1
then
    # Protected code here will be called only if stdin and stdout is a tty
    #
    echo "About to run keyboard polling"; sleep 3
    python /home/pi/poll_keyboard.py
fi

rsync두 번째 제안은 서비스를 실행하는 프로그램(예: 또는 ) 에 대한 원격 로그인을 처리하므로 더 안전할 것입니다 scp.

코드가 한 번만 고려되고 다음과 같은 경우에만 실행되도록 두 가지를 결합할 수도 있습니다.표준 입력그리고표준 출력터미널에 연결하세요. ( if...fi문장을 중첩하면 됩니다.)


test첫 번째 예에서 코드를 보호하기 위한 조건을 설명해 달라는 요청을 받았습니다 .

if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}"

이는 영어로 ""로 쓸 수 있습니다.$DONE_PROFILE비어 있거나 $DONE_PROFILE일치하는 항목이 없는 경우 $USER...".

비어 있거나 설정되지 않은 경우 이 ${USER:-unknown}구문이 이를 대체합니다.unknown$USER

이 경우 X표현식의 양쪽 앞에 배치하는 것은 !=아마도 불필요 하지만 이는 방어적인 스크립팅 접근 방식에서 비롯된 것입니다. $A값이 있는 변수 -z$B값이 있는 다른 변수를 생각해 보세요 apple. 일부 쉘에서는 구문이 유효하지 않기 test "$A" != "$B"때문에 쓰기가 확장됩니다 . test -z != apple양쪽에 접두사를 붙이면 확장이 구문적으로 안전 X해집니다 .test X-z != Xapple

관련 정보