【问题标题】:Access exported file in consumer Conan recipe访问消费者柯南食谱中的导出文件
【发布时间】:2021-04-23 12:58:27
【问题描述】:

我有一个柯南配方,可以打包可执行文件并导出 python 文件,例如:

class MyPackageConan(ConanFile):
    name = "my_package"
    version = "1.0.0"
    exports: "script.py"
    
    def package(self):
        if self.settings.os == "Windows"
            self.copy("*", dst="bin", src="bin/Windows")
        # if Linux, etc.

在另一个需要此包的配方中,从导出的 python 脚本访问函数的最简单方法是什么?

class MySecondPackageConan(ConanFile):
    requires = "my_package/1.0.0"

    def build(self):
        # import foo() from script.py

似乎很适合这种情况:

class MyPackageConan(ConanFile):
    name = "my_package"
    version = "1.0.0"
    settings = "os", "arch"      # I omitted it for simplicity in previous example

    def package(self):
        self.copy("script.py")
        if self.settings.os == "Windows":
            self.copy("*.exe", dst="bin", src="Windows")
        # elif Linux, Macos, ...
    
    def package_info(self):
        self.env_info.PYTHONPATH.append(self.package_folder)

【问题讨论】:

标签: python conan


【解决方案1】:

我有一个柯南配方,可以打包可执行文件并导出 python 文件,例如:

当您提到可执行文件时,您是指.exe 吗?如果是的话,在柯南文档中有一个很好的guide 怎么做。如果要打包二进制文件,则必须声明 osarch

在另一个需要此包的配方中,从导出的 python 脚本访问函数的最简单方法是什么?

在柯南docs 中有解释,但所有方法都在同一个配方中。您的情况需要稍作改动,我们来看一个例子:

# foo.py
def foobar():
    print("FOOBAR!")
# foo_req.py
from conans import ConanFile
import sys

class FooConan(ConanFile):
    exports = "foo.py"

    def package_info(self):
        sys.path.insert(0, self.recipe_folder)

from foo import *
# conanfile.py
from conans import ConanFile

class Pkg(ConanFile):
    python_requires = "foo_req/0.1@user/testing"

    def build(self):
        self.python_requires["foo_req"].module.foobar()

现在让我们构建所有这些:

conan create foo_req.py foo_req/0.1@user/testing
conan create conanfile.py foo/0.1@user/testing

这里,foo.py 是我们要导入的文件,但首先我们需要将其导出到 conan recipe 文件夹。真的需要吗?不,但是一旦导出,我们就会将其缓存。 我们还操作 pythonpath 来使用 recipe 文件夹,所以我们可以稍后导入 foo 模块。 导入后,它将成为柯南 python 需要模块的一部分。

【讨论】:

  • 重点是我希望可执行文件(.exe 文件)和 python 脚本成为我的柯南配方的一部分,因此我不能使用python_requires,因为这样的配方不应该打包任何东西,而是使用仅限export
  • 为什么不把它们分成单独的包呢?您仍然可以使用 python_requires 添加可执行包作为该包的要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多