所以我正在尝试创建一个setup.py
文件,在python中部署一个测试框架。
该库在pexpect
和easy_install
中具有依赖关系。因此,在安装easy_install
之后,我需要安装s3cmd
,这是一个与亚马逊S3配合使用的工具。
但是,要配置s3cmd
我使用pexpect
,但如果您想从新VM运行setup.py
,那么我们会遇到ImportError
:
import subprocess
import sys
import pexpect # pexpect is not installed ... it will be
def install_s3cmd():
subprocess.call(['sudo easy_install s3cmd'])
# now use pexpect to configure s3cdm
child = pexpect.spawn('s3cmd --configure')
child.expect ('(?i)Access Key')
# ... more code down there
def main():
subprocess.call(['sudo apt-get install python-setuptools']) # installs easy_install
subprocess.call(['sudo easy_install pexpect']) # installs pexpect
install_s3cmd()
# ... more code down here
if __name__ == "__main__":
main()
我知道当然我可以在使用initial_setup.py
之前创建另一个文件easy_install
以安装pexpect
和setup.py
,但我的问题是:是否有在安装它之前到import pexpect
的方式?该库将在使用之前安装,但Python解释器是否会接受import pexpect
命令?
答案 0 :(得分:7)
它不会接受它,但Python允许您在任何地方导入内容,而不仅仅是在全局范围内。因此,您可以推迟导入,直到您真正需要它为止:
def install_s3cmd():
subprocess.call(['easy_install', 's3cmd'])
# assuming that by now it's already been installed
import pexpect
# now use pexpect to configure s3cdm
child = pexpect.spawn('s3cmd --configure')
child.expect ('(?i)Access Key')
# ... more code down there
编辑:这种方式使用setuptools有一个特点,因为在Python重新启动之前不会重新加载.pth文件。您可以执行重新加载(找到here):
import subprocess, pkg_resources
subprocess.call(['easy_install', 'pexpect'])
pkg_resources.get_distribution('pexpect').activate()
import pexpect # Now works
(不相关:我宁愿假设脚本本身是使用所需的权限调用的,而不是使用sudo
。这对virtualenv很有用。)