Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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_Virtualenv_Dependency Management - Fatal编程技术网

有了python模块,在运行之前安装它自己的依赖项

有了python模块,在运行之前安装它自己的依赖项,python,virtualenv,dependency-management,Python,Virtualenv,Dependency Management,许多软件包要求系统用户在使用软件之前先安装一组依赖项。(这是一个不特定于python的一般性问题,但我将在python的上下文中讨论。)。如果依赖项还没有安装,我们不能让python模块在执行代码之前安装它自己的依赖项吗。在系统或子流程调用的帮助下,这应该是可行的,但我很少看到有人这样做 例如,假设lib是一个python库,需要在python文件main.py中使用: import os try: import lib except: os.system('pip instal

许多软件包要求系统用户在使用软件之前先安装一组依赖项。(这是一个不特定于python的一般性问题,但我将在python的上下文中讨论。)。如果依赖项还没有安装,我们不能让python模块在执行代码之前安装它自己的依赖项吗。在
系统
子流程
调用的帮助下,这应该是可行的,但我很少看到有人这样做

例如,假设
lib
是一个python库,需要在python文件main.py中使用:

import os
try:
    import lib
except:
    os.system('pip install pdir')
    import lib

# Can make use of lib now
这种方法是否有潜在的错误?这样做会给大项目带来问题吗


注意:这里的优点是,使用该文件的用户不必单独安装依赖项,他只需运行
python main.py
。我意识到的第二件事是,这种方法只有在使用
virtualenv
时才有意义。

你不应该这样做-pip没有依赖解析,所以不能保证你会得到某个版本。应使用
setup.py
requirements.txt
或其他方法安装依赖项


您也不应该仅仅为了运行代码而需要用户权限或sudo来安装软件包。用户应该知道安装软件包所需的软件包,因为它们可能来自PyPI或操作系统的软件包系统或公司内部的PyPI镜像-在这种情况下,静默安装依赖项不是一个好主意。

您永远不应该这样做-pip没有依赖项解析,因此无法保证你会得到一个特定的版本。应使用
setup.py
requirements.txt
或其他方法安装依赖项


您也不应该仅仅为了运行代码而需要用户权限或sudo来安装软件包。用户应该知道安装包所需的包,因为它们可能来自PyPI或OS的包系统或内部公司PyPI镜像,并且在这种情况下默默无闻地安装依赖项不是一个好主意。

< P>您可以总是考虑使用更高级的打印语句来通知用户。
try:
    import ConfigParser

except ImportError as err:
        print '\n'.join([i + ''.join(str(err).split(' ')[-1:]) for i in ['$ pip install ', '$ easy_install ']])
您可以建议他们以这种方式安装丢失的软件包

$ pip install ConfigParser
$ easy_install ConfigParser

另外,您可以考虑有一个“导入恐怖”的理由,建议用户运行其<代码> /Stuto.Py < /C>或<代码> /安装< <代码>,而不只是丢失的模块。

< P>您可以考虑使用更高级的打印语句来通知用户。
try:
    import ConfigParser

except ImportError as err:
        print '\n'.join([i + ''.join(str(err).split(' ')[-1:]) for i in ['$ pip install ', '$ easy_install ']])
您可以建议他们以这种方式安装丢失的软件包

$ pip install ConfigParser
$ easy_install ConfigParser

另外,你可以考虑有一个“导入恐怖”的理由来推荐用户运行他们的<代码> /Studio.Py < /C>或<代码> /安装< <代码>,而不仅仅是缺少的模块。

在安装程序中执行,而不是在运行时!你真的不应该默默地在人们的电脑上安装软件包。你会惹恼一些人的。嗯,这是有道理的。虽然我不确定人们是否应该担心他们的virtualenv中安装了python软件包。@Vincenzzochi很多系统都对这种事情很敏感。最好是提醒用户缺勤,他们可以修复它!在安装时执行此操作,而不是在运行时!你真的不应该默默地在人们的电脑上安装软件包。你会惹恼一些人的。嗯,这是有道理的。虽然我不确定人们是否应该担心他们的virtualenv中安装了python软件包。@Vincenzzochi很多系统都对这种事情很敏感。最好是提醒用户缺勤,他们可以修复它!