1

Debianサーバーで実行されている小さなPythonスクリプトに少し問題があります。

最初に何をすべきか:
-サーバーからリストを取得する->動作中
-実際の文字列リストに変換する->動作中
-ファイルに書き込む->何もしない...

すでにPythonインターフェース(>>>)で同じコードを使用しようとしましたが、すべてが適切に書き込まれます。
ファイルはすでに作成されており、chmod777がインストールされています。
偶然ではないかどうかをチェックしても、ファイルをロックするそのsciptの別のインスタンスが実行されていますが、何も実行されていません...

起動時にファイルが書き込まれないのに、インターフェイスで書き込まれる理由を誰かが知っていますか?

そして今、これがスクリプト自体です:

#!/usr/bin/env python

import urllib
import sys
import time
import re

exitNodes = []
readableNodes = []
class BlockTor():
    def getListFromWeb(myself):
        url = "https://www.dan.me.uk/torlist/"
        #url = "file:///E:/test.txt"

        try:
            for line in urllib.request.urlopen(url):
                exitNodes.append(str(line, encoding='utf8'))

            for node in exitNodes:
                readableNodes.append(re.sub('\\n', '', node))
            #print(exitNodes)
            #sys.exit()
        except:
            try:
                f = open("/var/log/torblocker.log", "a")
                #f = open("E:\\logfile.log", "a")
                f.write("[" + time.strftime("%a, %d %b %Y %H:%M") + "] Error while loading new tornodes")
                f.close()
            except:
                print("Can't write log")
                pass
            sys.exit()
            pass


    def buildList(myself):
        f = open("/etc/apache2/torlist/tor-ip.conf", "w")
        #f = open ("E:\\test-ips.conf", "w")
        f.write('<RequireAll>\n')
        f.write('   Require all granted\n')
        for line in readableNodes:
            f.write('   Require not ip ' + line + '\n')
        f.write('</RequireAll>')
        f.close()
        try:
            f = open("/var/log/torblocker.log", "a")
            #f = open("E:\\logfile.log", "a")
            f.write("[" + time.strftime("%a, %d %b %Y %H:%M") + "] Sucessfully updated tor blacklist")
            f.close()
        except:
            pass


    def torhandler(myself):
        BlockTor.getListFromWeb(myself)
        BlockTor.buildList(myself)


if __name__ == "__main__":
    asdf = BlockTor()
    BlockTor.torhandler(asdf)

編集:
言及するのを忘れた-テストしたい場合は注意してください:このサーバーは30分ごとに1つのリクエストのみを許可します

4

2 に答える 2

9

文字列を連結するには、+演算子を使用します。&ビット単位のANDです-2つの文字列で呼び出すと、次のようになりますTypeError

>>> "[" & ""
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'str' and 'str'

あなたの毛布exceptはそのエラーを抑制します。交換

try:
    f = open("/var/log/torblocker.log", "a")
    #f = open("E:\\logfile.log", "a")
    f.write("[" & time.strftime("%a, %d %b %Y %H:%M") & "] Sucessfully updated tor blacklist")
    f.close() # ^                                     ^
except:
    pass

with open("/var/log/torblocker.log", "a") as torf:
    torf.write("[" + time.strftime("%a, %d %b %Y %H:%M") + "] " +
               "Sucessfully updated tor blacklist")

ファイルに書き込めない場合の例外を無視したい場合は、で囲んでtry .. except IOError:ください。

于 2013-02-12T18:26:11.467 に答える
2
f.write("[" & time.strftime("%a, %d %b %Y %H:%M") & "] Error while loading new tornodes")

ですTypeError。文字列を連結するには+、ではなく、を使用します&TypeErrorここであなたはあなたの裸のexcept声明でキャッチします。これは、裸のexceptステートメントが通常は良い考えではない理由を示しています。一般に、予想されるエラーのみを処理し、適切に処理する方法を知っています。

文字列フォーマットを使用することもできます。

f.write('[{0}] Error while loading new tornodes'.format(time.strftime("%a, %d %b %Y %H:%M")))
于 2013-02-12T18:25:41.003 に答える