web-dev-qa-db-ja.com

ローカルサーバーでローカルpythonスクリプトを実行

私は、仮想マシンで実行する必要があるいくつかのpythonスクリプトをデバッグしています。そして、ローカルで(仮想マシンの外部で)スクリプトを編集することを好みます。したがって、tediousto scpがスクリプトを毎回仮想マシンに変更しました。誰かが効果的な方法を提案できますか?

特に、リモートPVMでpythonスクリプトを実行できるかどうか疑問に思っています。そのようなもの:

python --remote [email protected] hello.py //**FAKED**, served to explain ONLY
30
qweruiop

Sshを使用できます。 Pythonは、標準入力を実行するための引数としてハイフン(-)を受け入れ、

cat hello.py | ssh [email protected] python -

詳細についてはpython --helpを実行してください。

53
asdfg

この質問は新しいものではなく、回答がすでに選択されていますが、別の素敵なアプローチを共有したいと思います。

paramiko ライブラリの使用-純粋なpython SSH2の実装-your pythonスクリプトはSSH経由でリモートホストに接続でき、コピーそのホスト自体(!)をリモートホストで実行し、リモートプロセスのStdin、stdout、stderrをローカルの実行スクリプトで使用できるため、このソリューションはIDEにほとんど依存しません。

ローカルマシンで、リモート実行をトリガーするcmd-lineパラメーター「deploy」を使用してスクリプトを実行します。このようなパラメーターがないと、リモートホスト向けの実際のコードが実行されます。

import sys
import os

def main():
    print os.name

if __name__ == '__main__':
    try:
        if sys.argv[1] == 'deploy':
            import paramiko

            # Connect to remote Host
            client = paramiko.SSHClient()
            client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
            client.connect('remote_hostname_or_IP', username='john', password='secret')

            # Setup sftp connection and transmit this script
            sftp = client.open_sftp()
            sftp.put(__file__, '/tmp/myscript.py')
            sftp.close()

            # Run the transmitted script remotely without args and show its output.
            # SSHClient.exec_command() returns the Tuple (stdin,stdout,stderr)
            stdout = client.exec_command('python /tmp/myscript.py')[1]
            for line in stdout:
                # Process each line in the remote output
                print line

            client.close()
            sys.exit(0)
    except IndexError:
        pass

    # No cmd-line args provided, run script normally
    main()

この例を単純化するために、例外処理は省略されています。複数のスクリプトファイルがあるプロジェクトでは、おそらくすべてのファイル(およびその他の依存関係)をリモートホストに配置する必要があります。

36
Andreas N
ssh user@machine python < script.py - arg1 arg2

なぜならcat |は通常必要ありません

15
neric

あなたはssh経由でそれを行うことができます。

ssh [email protected] "python ./hello.py"

テキストエディタまたはX11転送を使用して、sshでスクリプトを編集することもできます。

5
smeso

OpenVPNサーバーに接続し、ルーティング設定(スプリットトンネリング)を要求するsshサーバーを実行しているホストで動的なローカルPyQt4スクリプトを実行する場合、Paramikoを使用する前にこれを行う必要がありました。

接続しているsshサーバーがスクリプト(私の場合はPyQt4)に必要なすべての依存関係を持っている限り、base64でエンコードしてexec()ビルトインを使用することで簡単にデータをカプセル化できますデコードされたメッセージの関数。正しく覚えていれば、このためのワンライナーは次のとおりでした。

stdout = client.exec_command('python -c "exec(\\"' + open('hello.py','r').read().encode('base64').strip('\n') + '\\".decode(\\"base64\\"))"' )[1]

読みづらく、エスケープシーケンスは2回解釈されるため、エスケープシーケンスをエスケープする必要があります(送信者が1回、受信者が1回)。また、デバッグが必要な場合があります。サーバーをPCSにパックしたか、OpenVPNルーティングスクリプトを参照するだけです。

ファイルの送信とは対照的に、この方法で行うことの違いは、ファイルがサーバー上のディスクに接触することはなく、メモリから直接実行されることです(もちろんコマンドをログに記録しない限り)。この方法で情報をカプセル化すると(非効率的ではありますが)、データを1つのファイルにパッケージ化するのに役立ちます。

たとえば、このメソッドを使用して、外部依存関係(つまり、イメージ)からの生データをメインスクリプトに含めることができます。

0
alisenby94