web-dev-qa-db-ja.com

pythonから変数を使用してシェルスクリプトを実行する

私はこのコードを持っています:

opts.info("Started domain %s (id=%d)" % (dom, domid))

上記のパラメータdomidを使用してシェルスクリプトを実行したいと思います。このようなもの:

subprocess.call(['test.sh %d', domid])

それはどのように機能しますか?

私はそれを試しました:

subprocess.call(['test.sh', domid])

しかし、私はこのエラーを受け取ります:

File "/usr/lib/xen-4.1/bin/xm", line 8, in <module>
    main.main(sys.argv)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 3983, in main
    _, rc = _run_cmd(cmd, cmd_name, args)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 4007, in _run_cmd
    return True, cmd(args)
  File "<string>", line 1, in <lambda>
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 1519, in xm_importcommand
    cmd.main([command] + args)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/create.py", line 1562, in main
    dom = make_domain(opts, config)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/create.py", line 1458, in make_domain
    subprocess.call(['test.sh', domid])
  File "/usr/lib/python2.7/subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
TypeError: execv() arg 2 must contain only strings
10
Vince

このような ?

subprocess.call(['test.sh', str(domid)])

ドキュメントは pythonウェブサイト で入手できます

15
Paco

ビンス

私もこの投稿と同じことをしたいと思っていました。シェルスクリプトをpython変数を使用して実行します(変数を使用すると、コマンドライン引数を使用することを意味します)。

結果を得るために次のことを行いました。他の人が同じ答えを探している場合に備えて共有しています。

 import os 
 arglist = 'arg1 arg2 arg3' 
 bashCommand = "/ bin/bash script.sh" + arglist 
 os.system(bashCommand)

私にとってはうまくいきました。

また、詳細を読んだ後、表示のために結果を取得したい場合は、subprocess.Popenを使用することをお勧めします。私はbashスクリプトですべてを別のファイルにログアウトしているので、サブプロセスは本当に必要ありません。

お役に立てば幸いです。

 import os 
 os.system( "cat /root/test.sh")
#!/ bin/bash 
 x = '1' 
 while [[$ x -le 10]]; do 
 echo $ x:hello $ 1 $ 2 $ 3 
 sleep 1 
 x = $(($ x + 1))
 done 
 
 arglist = 'arg1 arg2 arg3' 
 bashCommand = 'bash /root/test.sh' + arglist 
 os.system(bashCommand)
 1:hello arg1 arg2 arg3 
 2:hello arg1 arg2 arg3 
 3:hello arg1 arg2 arg3 
 4:hello arg1 arg2 arg3 
 5:hello arg1 arg2 arg3 
3

覚えておく簡単な解決策:

import os
bashCommand = "source script.sh"
os.system(bashCommand)
2
LearnOPhile

pythonスクリプトから以下の方法でシェルスクリプトを呼び出す必要があります。

subprocess.call(['test.sh', domid])

サブプロセスモジュールのドキュメントについては こちら を参照してください。上記のスクリプトでは、callメソッドにリストを渡します。最初の要素は実行されるプログラムで、リスト内の残りの要素はプログラムへの引数です。

0