Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在安装python模块之前导入它?_Python_Unix - Fatal编程技术网

如何在安装python模块之前导入它?

如何在安装python模块之前导入它?,python,unix,Python,Unix,因此,我试图创建一个setup.py文件,并在python中部署一个测试框架。 该库在pexpect和easy\u install中具有依赖项。因此,在安装了easy\u install之后,我需要安装s3cmd,这是一个用于Amazon S3的工具。 但是,要配置s3cmd我使用pexpect,但是如果您想从新的VM运行setup.py,那么我们会遇到一个ImportError: import subprocess import sys import pexpect # pexpect is

因此,我试图创建一个
setup.py
文件,并在python中部署一个测试框架。 该库在
pexpect
easy\u install
中具有依赖项。因此,在安装了
easy\u install
之后,我需要安装
s3cmd
,这是一个用于Amazon 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\u setup.py
,在使用
setup.py
之前安装
easy\u install
pexpect
,但我的问题是:有没有办法在安装前导入pexpect?库将在使用前安装,但是Python解释器是否会接受
import-pexpect
命令?

它不会接受这样的命令,但是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文件不会被重新加载。您可以强制重新加载(找到):


(无关:我宁愿假设脚本本身是以所需的权限调用的,而不是在其中使用
sudo
。这对virtualenv很有用。)

第一次出现错误时(我认为python没有发现模块已经安装)。第二次起作用。我怎么能避免呢?我遇到了以下错误:
全局名称“pkg_发行版”未定义
@philippe,对不起,我的错。这应该是
pkg\u资源
。你也需要导入它。已更新。
AttributeError:“模块”对象没有属性“分布”
您确定吗?:-(资本
D
在分配中
import subprocess, pkg_resources
subprocess.call(['easy_install', 'pexpect'])
pkg_resources.get_distribution('pexpect').activate()
import pexpect  # Now works