キャメロン・スパーはすでに一般的な答えを出しています。
しかし、あなたの特定のケースでは、おそらくこれは必要ありません。
pexpect.spawn
コマンドと引数の文字列、またはコマンド文字列と個別の引数文字列のリストのいずれかを受け入れます。subprocess
また、他のライブラリ (標準ライブラリモジュール内のすべてのものなど) のほとんどの同様のメソッドについても同じことが言えます。
したがって、次のように、各引数を文字列にするだけで済みます。
pexpect.spawn('ssh', ['-t', 'kity@192.199.61.205', 'sudo nohup bash -c "./tcp_sender > /dev/null 2>&1 &"'])
実際、ドキュメントはこれを具体的に示唆しています。これは、まさに次の理由によるものです。
spawn の 2 番目の形式 (引数のリストを渡す) は、コマンドを生成して独自の引数リストを渡したい場合に便利です。これにより、構文がより明確になります。
もちろん、あなたの場合、実際には引数のリストを使用してコマンドを生成しています...そのうちの1つは、それ自体が生成するコマンドであり、引数のリストですsudo
( )、明らかにこれらのステップの最初の段階でしか役に立ちません。幸いなことに、この場合、必要なのはそれだけです。nohup
bash
tcp_sender
pexpect
さらに必要な場合は、引数リストから POSIX スタイルの引用符付き文字列を生成できるライブラリがいくつかあります (基本的には の逆ですshlex
)。結局、自分で書き直してしまいました… 実際にはそれほど複雑ではありません (基本的には、すべてをエスケープしてからすべての引数を引用するだけです)。しかし、うまくいけば、これを行う必要はありません。