33
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

日に何度も繰り返しているローカルでビルドしたファイルのテストサーバーへのアップロードの一連の処理を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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
33
Help us understand the problem. What are the problem?