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"
答案 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;点下面。特别是如果您需要指定版本字符串,手动将调用拆分为列表将更具弹性。