"导入或安装的简写"?

时间:2015-11-19 17:34:19

标签: python

Python中有简写吗?

#!/usr/bin/python3
try:
  import tornado
except ImportError:
  print("Import not found, installing ...")
  import os
  os.system("sudo pip3 install tornado");
  import tornado

我们的想法是让代码“只是工作,没有问题”#34;而不是抱怨ImportError。此外,上面的代码要求我写"龙卷风" 3次,这不是很干。也就是说,是否有效地等同于:

import_and_dont_complain "tornado"

3 个答案:

答案 0 :(得分:4)

正确的解决方案是在setup.py中声明依赖关系。

from setuptools import setup

setup(name='herro',
      version='0.1',
      description='Is anybody there?',
      url='http://herro.example.com/',
      author='yourself',
      author_email='you@example.com',
      license='GPL',
      packages=['herro'],
      install_requires=['tornado'],  # <----- here
      zip_safe=False)

http://python-packaging.readthedocs.org/en/latest/dependencies.html

答案 1 :(得分:1)

在这里使用sudo是一个非常糟糕的主意。如果您要允许它安装自己的代码,而不是让它修改整个系统,最好直接使用该进程可写的virtualenv。 (也就是说,让网络服务修改自己的代码也是一个主要的安全漏洞;因此,您根本不应该这样做,而是使用确保依赖关系的安装过程提前出现。)

那说:

import subprocess

def import_and_dont_complain(name, globaldict=None):
    try:
        module = __import__(name)
    except ImportError:
        subprocess.check_call(['sudo', 'pip3', 'install', name])
        module = __import__(name)
    if globaldict is not None:
        globaldict[name] = module
    return module

...用作:

import_and_dont_complain('tornado', globals())

...或...

tornado = import_and_dont_complain('tornado')

明确传递globals字典可让您从其定义的模块以外的模块中调用此字典。

答案 2 :(得分:0)

我不知道,虽然您可以定义自己的功能,例如在utils.py或其中一些:

from subprocess import call

def import_or_install(package_name):
    try:
        imported = __import__(package_name)
    except ImportError:
        rc = call('sudo pip3 install {0}'.format(package_name).split())
        if rc != 0:
            raise RuntimeError('Could not install required package!')
        imported = __import__(package_name)
    return imported

然后从您正在工作的任何模块中开始:

from utils import import_or_install

tornado = import_or_install('tornado')

话虽如此,我不确定你为什么要这样做。如果您正在制作软件包,只需定义您需要的任何第三方模块作为依赖项,pip将在用户安装软件包时自动安装它们。

另请注意,上述解决方案并未递归检查故障。如果点子安装失败,您仍会获得ImportError

另一个注意事项,见查尔斯&#39;点下面。特别是如果您需要指定版本字符串,手动将调用拆分为列表将更具弹性。

相关问题