Python 使用init.d don';不写数据

Python 使用init.d don';不写数据,python,linux,shell,raspberry-pi,Python,Linux,Shell,Raspberry Pi,我编写了一个Python脚本,用于测量SPL,我希望将分数保存在日志文件中,并使用函数open()和write()。当我在shell中运行脚本时,一切都很好。当我将may脚本添加到init.d时,我的脚本不会在文件中写入数据,而只是创建文件 主脚本F.py是用Python 2.7编写的 card = 'default' roz_data = 128 array_float = numpy.dtype(float) stream = alsaaudio.PCM(alsaaudio.PCM_CAPT

我编写了一个Python脚本,用于测量SPL,我希望将分数保存在日志文件中,并使用函数open()和write()。当我在shell中运行脚本时,一切都很好。当我将may脚本添加到init.d时,我的脚本不会在文件中写入数据,而只是创建文件

主脚本F.py是用Python 2.7编写的

card = 'default'
roz_data = 128
array_float = numpy.dtype(float)
stream = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card)
stream.setchannels(1)
stream.setrate(48000)
stream.setformat(alsaaudio.PCM_FORMAT_S16_LE)
stream.setperiodsize(roz_data)
def listen():
    print("Listening")
    glob_leq = 0 # suma kwadratow z tablicy (375 po 128 przy probkowaniu 48000)
    liczba_ramek = 0
    b, a = A_weighting(48000)
    index_ramek = 0
    while True:
            try:
                    arch = open("/home/pi/A/mikrofon.txt","a")
                    l, data = stream.read()
            except IOError, e:
                    error_count += 1
                    print(" (%d) Error recording: %s" % (error_count, e))
            else:
                    if l==roz_data:
                            decoded_block = numpy.frombuffer(data, dtype='int16' )
                    else:
                            continue
                    decoded_block = lfilter(b , a, decoded_block)
                    maks = 32768
                    array_float = numpy.divide(decoded_block ,float( maks))
                    array_float = array_float**2
                    sum_array = numpy.sum(array_float, dtype=float)
                    glob_leq = glob_leq + sum_array
                    liczba_ramek += 1
                    index_ramek += 1
                    if index_ramek == 3750:
                       index_ramek=0
                       cis_chwil = numpy.divide(glob_leq, liczba_ramek * roz_data)
                       leq =10*numpy.log10(numpy.divide(cis_chwil, hPa))
                       dB = str(format(leq,'.2f'))
                       czas = str(time.time())
                       arch.writelines(czas + ' ' + dB + '\n')
                       glob_leq=0
                       liczba_ramek=0

listen()
和初始化脚本:

#! /bin/sh
# /etc/init.d/mic

### BEGIN INIT INFO
# Provides:          Skrypt
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6 
# Short-Description: Skrypt
# Description:       Skrypt
### END INIT INFO

case "$1" in
  start)
    echo "Starting mic recoding"
    # run application you want to start
    python /home/pi/A/f.py &
    ;;
  stop)
    echo "Stopping skrypt"
    # kill application you want to stop
    killall python
    ;;
  *)
    echo "Usage: /etc/init.d/mic{start|stop}"
    exit 1
    ;;
esac

exit 0

创建一个合适的守护进程(在后台运行的进程)要获得正确的所有细节似乎很复杂。也许最好不要重新发明轮子,而是使用现有的库来为您处理细节。比如。然后,您可以将守护进程配置为编写一个PID文件,这样您就可以终止特定进程,而不是系统上的每个python进程。

我正在解决这个问题。用户路径和根目录之间可能有些不同,而不是使用守护进程。在switch-sex中使用sudo已经足够了。starting命令应该类似于“sudo-spipython/home/pi/a/f.py”,启动脚本在init.d中

可能在再次打开文件之前关闭该文件。可能还需要通过
chkconfig
或您的特定发行版使用的任何东西在
/etc/rc*.d
中创建适当的符号链接?它是Linux raspberrypi 4.1.19-v7+#2 SMP armv7lSide注意:
killall python
可能会杀死比您预期更多的东西…好的。我尝试使用python守护进程,并将编写是否带来结果。我知道问题出在哪里。当守护进程与我的脚本一起运行时,它的进程状态为S,这意味着它正在等待某些东西(睡眠),可能我必须更改写入数据的方式,但当我从shell运行时,得到了进程状态R(运行)。这不是您上面描述的问题。但这是一个问题,因为你的守护进程似乎使用了100%的CPU,而且从不休眠。我正在解决这个问题。用户路径和根目录之间可能有些不同。在switch-sex中使用sudo已经足够了。启动命令应该类似于“sudo-spipython/home/pi/a/f.py”。顺便说一下,谢谢你的帮助。