2

この python アプリケーションを変更しようとしています{- https://github.com/kliment/Printrun/blob/master/pronsole.py は、3D プリンターの制御に使用されます。基本的にはコマンドライン版のアプリにudp受信を追加して作ったiPhoneアプリから制御できるようにしようと思っています。私はpythonアプリにudpをうまく受け取り、受け取ったさまざまなメッセージを解読しています。このpythonスクリプトには、使用されるすべてのメソッドを定義するクラスがあります。これは非常に簡素化されたバージョンであり、問​​題を引き起こしている方法があります-

class pronsole(cmd.Cmd):
    def __init__(self):
        cmd.Cmd.__init__(self)
        if not READLINE:
            self.completekey = None
        self.p = printcore.printcore()
        self.p.recvcb = self.recvcb
        self.recvlisteners = []
        self.prompt = "PC>"
        self.p.onlinecb = self.online
        self.f = None
    ...

    def do_connect(self, l):
        a = l.split()
        p = self.scanserial()
        port = self.settings.port
        if (port == "" or port not in p) and len(p)>0:
            port = p[0]
        baud = self.settings.baudrate or 115200
        if(len(a)>0):
            port = a[0]
        if(len(a)>1):
            try:
                baud = int(a[1])
            except:
                print "Bad baud value '"+a[1]+"' ignored"
        if len(p) == 0 and not port:
            print "No serial ports detected - please specify a port"
            return
        if len(a) == 0:
            print "No port specified - connecting to %s at %dbps" % (port, baud)
        if port != self.settings.port:
            self.settings.port = port
            self.save_in_rc("set port", "set port %s" % port)
        if baud != self.settings.baudrate:
            self.settings.baudrate = baud
            self.save_in_rc("set baudrate", "set baudrate %d" % baud)
        self.p.connect(port, baud)

プリンターを移動する「do_move」というクラスに別のメソッドがあり、udp を受信したときにそのメソッドを呼び出しています。私はそれを正しく呼んでいると思います-

a = pronsole()
a.do_move("X 29")

呼び出そうとしていますが、まだプリンターに接続していないため実行できません。だから私は電話をかけてみました-

a = pronsole()
a.do_connect("")

クラスの最後に、「設定ポートの保存に失敗しました: pronsole インスタンスに属性 'rc_filename' がありません」というエラー メッセージが表示されます。

「rc_filename」を使用しようとしている方法はこれです-

def save_in_rc(self, key, definition):
    """
    Saves or updates macro or other definitions in .pronsolerc
    key is prefix that determines what is being defined/updated (e.g. 'macro foo')
    definition is the full definition (that is written to file). (e.g. 'macro foo move x 10')
    Set key as empty string to just add (and not overwrite)
    Set definition as empty string to remove it from .pronsolerc
    To delete line from .pronsolerc, set key as the line contents, and definition as empty string
    Only first definition with given key is overwritten.
    Updates are made in the same file position.
    Additions are made to the end of the file.
    """
    rci, rco = None, None
    if definition != "" and not definition.endswith("\n"):
        definition += "\n"
    try:
        written = False
        if os.path.exists(self.rc_filename):
            import shutil
            shutil.copy(self.rc_filename, self.rc_filename+"~bak")
            rci = codecs.open(self.rc_filename+"~bak", "r", "utf-8")
        rco = codecs.open(self.rc_filename, "w", "utf-8")
        if rci is not None:
            overwriting = False
            for rc_cmd in rci:
                l = rc_cmd.rstrip()
                ls = l.lstrip()
                ws = l[:len(l)-len(ls)] # just leading whitespace
                if overwriting and len(ws) == 0:
                    overwriting = False
                if not written and key != "" and  rc_cmd.startswith(key) and (rc_cmd+"\n")[len(key)].isspace():
                    overwriting = True
                    written = True
                    rco.write(definition)
                if not overwriting:
                    rco.write(rc_cmd)
                    if not rc_cmd.endswith("\n"): rco.write("\n")
        if not written:
            rco.write(definition)
        if rci is not None:
            rci.close()
        rco.close()
        #if definition != "":
        #    print "Saved '"+key+"' to '"+self.rc_filename+"'"
        #else:
        #    print "Removed '"+key+"' from '"+self.rc_filename+"'"
    except Exception, e:
        print "Saving failed for", key+":", str(e)
    finally:
        del rci, rco

コマンドラインからdo_connectメソッドを呼び出してみましたが、うまくいくので、Pythonスクリプト内で同じように呼び出せない理由がわかりませんでした。私がそれを行うときにpronsoleのインスタンスを参照しているという事実と関係があると思います-

a = pronsole()
a.do_connect("")

静的メソッドにしようとしましたが、他の問題が発生します。だから私の質問は、Pythonスクリプトからこの「do_connect」メソッドを呼び出すにはどうすればよいですか? 私が言ったように、私は python noob です。私は udp を機能させて統合する方法を理解するのに成功しましたが、私が感じているこの 1 つのことに行き詰まっています。どんな助けでも大歓迎です。

4

1 に答える 1

1

私も最近これをやりたかったので、pythonスクリプトからの出力をpronsole.pyプログラムにパイプすることで解決しました。

したがって、pronsole コードを変更するのではなく、すべてのソケット機能を別の Python プログラムに実装し、stdout 経由でコマンドを pronsole に送信しました。私のプログラムは「pronsole_interface」と呼ばれていたので、コマンドラインから次のように呼び出しました。

python pronsole_interface.py | pronsole.py
于 2013-10-01T00:30:09.370 に答える