この 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 つのことに行き詰まっています。どんな助けでも大歓迎です。