When creating a Python package using setuptools, I was in trouble [1](# 1) </ sub> because I couldn't "copy the directory to an arbitrary location when executing install", so I forced it. I tried it.
setup.py
# coding: utf-8
import setuptools
from setuptools.command.install import install
import shutil
#Extend the standard install command
class my_install(install):
description = "install myapp"
#Add options required for your processing
user_options = install.user_options + [
('my-data-dir=', 'd', "base directory for installing my data files." ),
]
def initialize_options(self):
self.my_data_dir = '/opt/myapp-data' #Set default value
install.initialize_options(self)
def _pre_install(self):
#Write what you want to do
shutil.copytree('./data',self.my_data_dir)
def run(self):
#Insert the process you want to do before executing the original install process.
self._pre_install()
install.run(self)
def get_outputs(self):
# get_outputs is--Called when the record option is specified, it returns a list of files and directories created during installation.
#If there is something you want to remove when you do pip uninstall, return it here.
return install.get_outputs(self) + [self.my_data_dir]
setuptools.setup(
name='myapp',
version='1.0',
description='my python application',
author='kokm',
author_email='xxx@xxx',
url='http://xxx.xxx/yyy',
#Replace the install command with yours
cmdclass={'install': my_install},
)
Extend setuptools.command.install
as you like and pass it as the cmdclass
parameter of setup ()
. that's all.
Of course, commands other than install can be extended in the same way.
Run setup.py normally.
The options you add are reflected in the output of setup.py install --help
.
python
cd myapp
python setup.py install --my-data-dir=/opt/myapp-data
When using pip, please note that the options you added will not pass unless you use --install-option
.
python
pip install --install-option='--my-data-dir=/opt/myapp-data' myapp-1.0.tar.gz
pip uninstall myapp
http://pythoninside.com/en/source-code/2.7.5/distutils/command/install.py
1. You can use install_data to copy files.