标签: python-module

测试正在安装的Python模块依赖项

考虑到模块的名称,如何测试是否安装了一组模块.例如

modules = set(["sys", "os", "jinja"])

for module in modules:
  # if test(module exists):
  #   do something
Run Code Online (Sandbox Code Playgroud)

虽然可以将测试写成:

try:
  import sys
except ImportError:
  print "No sys!"
Run Code Online (Sandbox Code Playgroud)

这对我正在做的事情来说有点麻烦.有没有动态的方法来做到这一点?

我已经尝试了eval("import%s"%module),但是抱怨编译错误.

我很感谢你的想法和建议.谢谢.

python reflection import module python-module

7
推荐指数
3
解决办法
3994
查看次数

如何在没有子包的情况下创建包含多个文件的python包

我正在尝试创建一个包含几个类的包 (mypackage),但希望这些类包含在多个文件中。

例如,我希望 class_a.py 包含一个名为 ClassA 的类,等等...

因此,我想要以下文件结构:

  .../mypackage 
       __init__.py
       class_a.py
       class_b.py
       ...
Run Code Online (Sandbox Code Playgroud)

但是,我想按如下方式加载和使用该包:

load mypackage
a = mypackage.ClassA()
Run Code Online (Sandbox Code Playgroud)

我需要做什么(我在 __init__.py 中假设)文件才能使这成为可能。目前,它使用“mypackage.class_a.ClassA()”运行?

python python-module

7
推荐指数
2
解决办法
5822
查看次数

__init__.py无法找到本地模块

借用http://pythoncentral.io/how-to-create-a-python-package/上的简化示例

我有一个类似的文件结构如下,其中Mammals.py和Birds.py定义具有相同名称的类:

Project/
  Animals/
    __init__.py
    Mammals.py
    Birds.py
Run Code Online (Sandbox Code Playgroud)

Project/目录中运行ipython解释器并且__init__.py为空时,以下工作:

from Animals.Mammals import Mammals
x = Mammals()
x.printMammals()
Run Code Online (Sandbox Code Playgroud)

我希望能够写from Animals import Mammals而不是from Animals.Mammals import Mammals.我相信这样做的方法是使__init__.py文件内容如下:

from Mammals import Mammals
from Birds import Birds
Run Code Online (Sandbox Code Playgroud)

但是,完成此操作后,从类似的Project/源ipython解释器中,以下输入会产生错误:

In [1]: from Animals import Mammals
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-6d651848af9b> in <module>()
----> 1 from Animals import Mammals

/Users/username/Project/Animals/__init__.py in <module>()
----> 1 from Mammals import Mammals
      2 from Birds …
Run Code Online (Sandbox Code Playgroud)

python packages python-module init

7
推荐指数
1
解决办法
1万
查看次数

将python脚本变成函数

假设我写了morning.py一个执行简单打印语句的脚本

# morning.py
print 'Good morning'
Run Code Online (Sandbox Code Playgroud)

几个小时后,我意识到我必须在另一个名为evening.py. 我知道有两种选择。首先,morning.py作为子进程调用

# evening.py
import subprocess
import shlex
process = subprocess.Popen(shlex.split('python morning.py'))
process.communicate()
Run Code Online (Sandbox Code Playgroud)

这是我最初选择的方式。问题是我想将我的程序 ( morning+ evening)打包成一个可执行文件。据我所知,从 exe 文件中这样的调用是行不通的。

另一种选择是将模块morning变成一个函数。例如,像这样

# morning.py
def morning_func():
   print 'Good morning'
Run Code Online (Sandbox Code Playgroud)

然后我可以简单地从evening模块调用这个函数

# evening
import morning
morning.morning_func()
Run Code Online (Sandbox Code Playgroud)

这里的问题是,与morning我实际的初始脚本不同,它非常扩展和混乱。我无法执行单个函数来模拟脚本运行流程。将整个脚本包装在一个函数中感觉不对。

有哪些可能的解决方案?

python python-module

7
推荐指数
1
解决办法
8182
查看次数

将python模块从一个系统复制到另一个系统

是否可以将所有python模块从一台Windows计算机复制到另一台计算机?它们都运行相同版本的Python 2.7.12。

这样做的原因是我可以在其中一个上访问Internet,而在另一个上手动安装模块则由于依赖而需要大量时间。

windows python-module python-2.7

7
推荐指数
1
解决办法
7897
查看次数

从两条不同路径导入的类不相等?

似乎使用两个不同的PYTHONPATHs 导入的实体不是相同的对象.

我在我的代码中遇到了一个小问题,我想用一个小例子来解释它.

我创建了源代码树:

a/
  __init__.py
  b/
    __init__.py
    example.py
Run Code Online (Sandbox Code Playgroud)

在example.py中:

class Example:
  pass
Run Code Online (Sandbox Code Playgroud)

从文件夹的父级a,我运行python和这个测试:

>>> import sys
>>> sys.path.append("/home/marco/temp/a")
>>> 
>>> import a.b.example as example1
>>> import b.example as example2
>>> 
>>> example1.Example is example2.Example
False
Run Code Online (Sandbox Code Playgroud)

所以问题是:结果为什么False?即使通过两个不同的路径导入,该类也是相同的.如果类是自定义异常并且您尝试捕获它,那么这是一个完全混乱except.

用python 3.4.3测试

python python-module python-import

7
推荐指数
1
解决办法
609
查看次数

如何使用 sys.path_hooks 自定义加载模块?

我希望下面的问题不会太长。但除此之外,我无法通过问题和我想要的来解释:

如何使用 importlib 从任意来源导入模块中学习(我昨天的问题)我为新文件类型 (.xxx) 编写了一个特定的加载程序。(实际上 xxx 是 pyc 的加密版本,以防止代码被盗)。

我只想为新文件类型“xxx”添加一个导入挂钩,而不会以任何方式影响其他类型(.py、.pyc、.pyd)。

现在,加载器是ModuleLoader,继承自mportlib.machinery.SourcelessFileLoader.

使用sys.path_hooksloader 应添加一个钩子:

myFinder = importlib.machinery.FileFinder
loader_details = (ModuleLoader, ['.xxx'])
sys.path_hooks.append(myFinder.path_hook(loader_details))
Run Code Online (Sandbox Code Playgroud)

注意:这是通过调用激活一次 modloader.activateLoader()

加载名为test(这是一个test.xxx)的模块后,我得到:

myFinder = importlib.machinery.FileFinder
loader_details = (ModuleLoader, ['.xxx'])
sys.path_hooks.append(myFinder.path_hook(loader_details))
Run Code Online (Sandbox Code Playgroud)

但是,当我sys.path_hooks在添加钩子之前删除内容时:

sys.path_hooks = []
sys.path.insert(0, '.') # current directory
sys.path_hooks.append(myFinder.path_hook(loader_details))
Run Code Online (Sandbox Code Playgroud)

有用:

>>> modloader.activateLoader()
>>> import test
using xxx class

in xxxLoader exec_module
in xxxLoader get_code: .\test.xxx
ANALYZING ...

GENERATE …
Run Code Online (Sandbox Code Playgroud)

python python-module python-import python-3.4

7
推荐指数
2
解决办法
3953
查看次数

如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

我在 Cloud9 中使用 Python AWS CDK,我正在部署一个简单的 Lambda 函数当对象上传到 S3 存储桶(也由 CDK 创建)时,该函数应该向 Atlassian 的 API发送 API 请求。这是我的 CDK 堆栈代码:

from aws_cdk import core
from aws_cdk import aws_s3
from aws_cdk import aws_lambda
from aws_cdk.aws_lambda_event_sources import S3EventSource


class JiraPythonStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here
        jira_bucket = aws_s3.Bucket(self,
                                    "JiraBucket",
                                    encryption=aws_s3.BucketEncryption.KMS)

        event_lambda = aws_lambda.Function(
            self,
            "JiraFileLambda",
            code=aws_lambda.Code.asset("lambda"),
            handler='JiraFileLambda.handler',
            runtime=aws_lambda.Runtime.PYTHON_3_6,
            function_name="JiraPythonFromCDK") …
Run Code Online (Sandbox Code Playgroud)

python python-module aws-cloudformation aws-lambda aws-cdk

7
推荐指数
3
解决办法
5528
查看次数

在 Azure Functions 中安装 Python 模块

我正在学习如何使用 Azure 函数并在其中使用我的网页抓取脚本。

它使用 BeautifulSoup (bs4) 和 pymysql 模块。

当我按照 MS 指南在虚拟环境中本地尝试时,它工作正常:

https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function-azure-cli?pivots=programming-language-python&tabs=cmd%2Cbrowser#run-the-局部功能

但是,当我创建函数 App 并向其发布脚本时,Azure Functions 日志给出以下错误:

Failure Exception: ModuleNotFoundError: No module named 'pymysql'

尝试导入它时一定会发生这种情况。

我真的不知道如何继续,我应该在哪里指定需要安装哪些模块?

python python-module azure azure-functions azure-function-app

7
推荐指数
1
解决办法
2万
查看次数

以尽可能少的行数完整导入模块内的本地文件

假设我正在编写一个自定义 PIP 包,其结构如下:

\n
.\n|    setup.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 src\n|   |    __init__.py\n|   |    useful_functions_i.py\n|   |    useful_functions_ii.py\n|   |    useful_strings.py\n|\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 tests\n    |    unit_tests.py\n\n
Run Code Online (Sandbox Code Playgroud)\n

假设useful_strings看起来像这样:

\n
.\n|    setup.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 src\n|   |    __init__.py\n|   |    useful_functions_i.py\n|   |    useful_functions_ii.py\n|   |    useful_strings.py\n|\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80 tests\n    |    unit_tests.py\n\n
Run Code Online (Sandbox Code Playgroud)\n

并且useful_functions_iuseful_functions_ii包含执行以下操作的函数:

\n
USEFUL_STRING_A = "useful-string-a"\nUSEFUL_STRING_B = "useful-string-b"\n...\n
Run Code Online (Sandbox Code Playgroud)\n

我应该如何导入useful_stringsand ?useful_functions_iuseful_functions_ii(这并不是一个看起来那么简单的问题。

\n

如果我使用:

\n
def a_useful_function(a_string):\n    if a_string == useful_strings.USEFUL_STRING_XYZ:\n        return True\n    return False\n
Run Code Online (Sandbox Code Playgroud)\n

src如果我尝试在本地运行一些代码,那么效果会很好;pip install .如果我运行并尝试将代码库用作 …

python python-module python-import pytest

7
推荐指数
1
解决办法
616
查看次数