LoginSignup
34
34

More than 5 years have passed since last update.

Pythonでファイルのコピー、リネーム、サーバへのアップロードを行う

Last updated at Posted at 2018-03-26

日に何度も繰り返しているローカルでビルドしたファイルのテストサーバーへのアップロードの一連の処理をPythonを使って自動化してみた。

環境

  • macOS HighSierra 10.13.3
  • Python3.6.4

やりたい事

  1. ファイルの確認
  2. ファイルのコピー
  3. ファイル名の変更
  4. テストサーバーへのファイルのアップロード

ファイルの確認

処理を実行する前に対象となるファイルの存在を確認する。

os.path.isfile()

指定のパスのファイルが存在すればtrueを返す


import os
src = './app.war'
if os.path.isfile(src):

ファイルのコピー

ファイルの存在が確認出来たらファイルをコピーする。

shutil.copy()

ファイルをコピーする

import shutil
src = './app.war'
copy = './dest/app.war'
shutil.copyfile(src,copy)

ファイル名の変更

テストサーバーの環境に合わせてファイル名を変更する。

os.rename()

ファイル名を変更する

import os
copy = './dest/app.war'
dest = "./dest/change.war"
os.rename(copy,dest)

ただしshutil.copy()の実行時に出力先のpathを変更後のファイル名にしておけばリネームも同時に行ってくれる。

import shutil
src = './app.war'
dest = "./dest/change.war"
shutil.copy(src,dest)

参照: [Python]ファイル/ディレクトリ操作/Qiita

テストサーバーへファイルをアップロード

Paramikoを使いsftpでテストサーバーへファイルをアップロードする。

Paramiko

SSHv2プロトコルライブラリ

インストール

$ pip install paramiko

sftpによるアップロード

import paramiko

dest = './dest/change.war'

HOST = 'testserver.com'
PORT = 22
USER = 'user'
KEY = 'private/key/path'

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)

client.connect(HOST,PORT,USER,key_filename=KEY)
sftp = client.open_sftp()
sftp.put(dest,'remote/path')

sftp.close()
client.close()

コード全文

upload.py
import os
import shutil
import paramiko

src = './app.war'
copy = './dest/app.war'
dest = './dest/change.war'

if os.path.isfile(src):
  shutil.copyfile(src,copy)
  os.rename(copy,dest)

  HOST = 'testserver.com'
  PORT = 22
  USER = 'user'
  KEY = 'private/key/path'

  client = paramiko.SSHClient()
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy)

  client.connect(HOST, PORT, USER, key_filename=KEY)
  sftp = client.open_sftp()
  sftp.put(dest,'remote/path')

  sftp.close()
  client.close()

upload.py作成後はアップロード時にファイルを実行するだけで済む

$ python3 upload.py

その他の手段

subprocessモジュールを使えばPythonでコマンドを実行する事が出来るので同様の処理が行える。

app.py
import subprocess
src = './app.war'
copy = './dest/app.war'
subprocess.run(["cp",src,copy])

あれこれ調べずにとにかくコマンドが実行出来るのでいざという時便利かもしれない。

参照: submodule/docs.python

34
34
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
34