将命令行参数传递给 pip install

2024-01-12

我目前正在开发一个导入 Fortran 模块的 Python 项目。这setup.py看起来与那个类似

from numpy.distutils.core import Extension
from numpy.distutils.core import setup

ext = Extension(
    name = "fortran_module",
    sources = ["fortran_module.f90"],
    extra_f90_compile_args = ["-some -compile -arguments"]
)

setup(
    ...,
    ...,
    ...,
    ext_modules = [ext],
    ...,
    ...,
    ...
)

我目前正在安装它pip install -e .,效果很好。 但有时我需要改变extra_f90_compile_args我想在安装过程中将它们作为命令行参数pip而不是改变setup.py文件。例如这样的事情:

pip install -e --compile_args="-O3 -fbacktrace -fbounds-check -fopenmp" .

是否可以通过传递命令行参数pip进入setup.py file?

与此相关,我还想将不同的设置选项传递给setup.py。例如

pip install -e --setup=setup1 .

or

pip install -e --setup=setup2 .

并取决于是否setup1 or setup2或者它们都没有通过,我想包含不同的 Fortran 源文件并使用不同的编译它们extra_f90_compile_args.

这可能吗?


Edit:让我们考虑以下示例:Fortran 模块与 OpenMP 并行。现在我希望用户决定是否并行编译。也许OpenMP库不可用,用户需要编译串行版本。

My setup.py现在看起来如下

from numpy.distutils.core import Extension
from numpy.distutils.core import setup
import os
from setuptools.command.install import install as _install

extra_f90_compile_args = ""
extra_link_args = ""

class install(_install):
    user_options = _install.user_options + [('build=', None, None)]

    def initialize_options(self):
        _install.initialize_options(self)
        self.build = None

    def finalize_options(self):
        _install.finalize_options(self)

    def run(self):
        global extra_f90_compile_args
        global extra_link_args
        if(self.build == "parallel"):
            extra_f90_compile_args += "-fopenmp"
            extra_link_args += "-lgomp"
            os.makedirs("~/test/")
        _install.run(self)

ext = Extension(
    name="test_module.fortran_module",
    sources=["test_module/fortran_module.f90"],
    extra_f90_compile_args=[extra_f90_compile_args],
    extra_link_args=[extra_link_args]
)

setup(
    name="test_module",
    packages=["test_module"],
    ext_modules=[ext],
    cmdclass={'install': install}
)

如果我安装这个

pip install . --install-option="--build=parallel"

它正在执行代码if-堵塞。我创建了test/目录只是为了检查这个。如果build没有给出或不同于parallel, the test/未创建目录。

但是,该代码不是使用 OpenMP 编译的。我认为这是因为Extension对象是在调用之前创建的setup(),其中对参数进行求值。我想首先评估参数,然后创建Extension对象取决于参数,然后调用setup().

我怎样才能做到这一点?


处理两者--install-option and --global-option如果我认为有不止一种选择,那就显得很混乱。我想补充一下这个现实生活中的解决方案 https://github.com/spotify/annoy/blob/57a47fc8a18dec6c5fd439143259ead36ec14eca/setup.py#L57-L63

相反,采用环境变量,并在安装时设置它们。

在setup.py中:

import os
config_var = os.environ.get("MY_PARAM", None)
if config_var:
    do_something()
setup()

并像这样调用 pip :MY_PARAM="Some_value" pip install my_module

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将命令行参数传递给 pip install 的相关文章

随机推荐

  • 使用 Java 8 Streams 将地图的地图转换为列表

    我有一张地图 Map
  • 根据上下文启用或禁用验证

    介绍 我有两个TextBox在我看来 每个属性都绑定到我的视图模型中的某些属性 Property1 Property2 TextBox或者在某些布尔值和属性上启用 并使用进行验证IDataErrorInfo在视图模型中 视图中的一些样式 P
  • Android:以编程方式创建和发送 XML SOAP 请求

    您好 提前致谢 我找到了这个教程 我正在尝试模仿它 http lalit3686 blogspot com 2012 06 calling soap webservice using httppost html http lalit3686
  • 使用 NginX 和 Laravel:URL 重写

    我正在尝试在运行 CentOS 6 4 和 NginX 1 8 的 VPS 上设置 Laravel 框架 我可以让其他一切都完美工作 但我无法让更干净的 URL 工作 例如使用 website com home 而不是 website co
  • 如何在WebView Windows 10 UWP中调用javascript?

    我正在尝试在 WebView 中加载 JavaScript 来进行一些计算并以字符串形式获取输出 我尝试使用以下代码 string htmlFragment
  • 确定 JavaScript 中浏览器窗口的位置?

    由于各种愚蠢的原因 我希望能够检测屏幕上浏览器窗口的矩形 标题栏等等 这可能吗 还是 JavaScript 仅限于其页面的视图端口 Edit 我可能不清楚 但视图端口是窗口中可见的页面部分 这可能不是浏览器中常用的术语 但在图形中很常见 对
  • R如何在涉及3个变量的情况下创建类似数据透视表的数据框?

    我在 R 中有以下数据框 它为我提供了客户 1 2 和 3 的交易记录 每行显示交易已进行的期间类型以及花费的金额 id lt c 1 2 3 1 1 2 3 2 2 period lt c calib valid valid calib
  • C++:将函数分配给 tr1::function 对象

    我们的一个类提供了 tr1 function 回调对象 但是 当我尝试为其分配成员函数时 出现编译器错误 以下示例未经测试 仅用于说明 Foo h class Foo public Foo std tr1 function
  • 使用 foreach 循环清除 PHP 数组值的效率

    哪个对于清除数组中的所有值更有效 第一个需要我每次在第二个示例的循环中使用该函数 foreach array as i gt value unset array i Or this foreach blah blah as blah foo
  • 如何从layout.xml中删除默认的cardview边框

    我无法删除 CardView 的默认边框 以前有人遇到过这个问题吗 两条边界线重叠 CardviewDesign xml
  • 处理大量文本时防止内存问题

    我编写了一个程序 可以分析项目的源代码并根据代码报告各种问题和指标 为了分析源代码 我加载项目目录结构中存在的代码文件并从内存中分析代码 该代码在传递给其他方法进行进一步分析之前会经过大量处理 处理代码时 代码会传递给多个类 有一天 我在我
  • 谷歌地图dequeueBuffer:BufferQueue已被放弃

    我在使用 Google 地图小部件时遇到了一些问题 简而言之 我有 3 个页面 带有底部导航栏的主页 地图页面 脚手架主体中带有 GoogleMap 的基本状态小部件 以及另一个页面 每次我从地图页面切换得太快时 我都会收到此错误 并且整个
  • 视图、模型和 ViewModel 之间有哪些常见关系?

    我正在与设计师一起开发 Windows Phone 7 应用程序 我使用 XNA 进行了 C 开发 所以我了解 C 但不熟悉模型 视图 ViewModel 架构 我们的第一个破解是为任何给定视图激活多个 ViewModel 每个 ViewM
  • 即使 cpanm 声称它是最新的,也无法找到 perl 模块

    我尝试使用File Slurp module use v5 14 use warnings use File Slurp my text read file test txt 但是当我运行这个时 我收到错误 Can t locate Fil
  • SQL -> 关系代数

    假设我有以下关系 Branch branchNo PK street city postcode Staff staffNo PK fName lName sex branchNo FK 这对于这个问题来说并不重要 但是 PK 主键 FK
  • Xamarin 形成值转换器导致无限循环

    我试图获得一个使用转换器的简单双向绑定示例 但是一旦条目中的值发生变化 例如如果您输入 1 它就会陷入无限循环 它会到达 ConvertBack 方法的末尾并设置值正确 然后 它再次调用 ConvertBack 方法 除了这次的值是 11
  • SQL在两个表排列中向上或向下移动行

    我有两个以这种方式设计的表 并考虑到可能的元素重新排列 1 dbo test db 002 with columns id INT NOT NULL IDENTITY 1 1 PRIMARY KEY name NVARCHAR 255 an
  • 在 Go 代码中如何在超时时终止进程及其子进程?

    我遇到一种情况 我需要在一段时间后终止一个进程 我开始这个过程 然后 case lt time After timeout if err cmd Process Kill err nil return 0 fmt Errorf Failed
  • Markdown 中的语义标记

    我想使用简单的文本编辑器和 Markdown 做课堂笔记 有没有办法标记文本元素以使它们机器可读 例如 我想将某些单词和短语标记为 定义 然后 我可以运行某种脚本来显示单词及其相应的定义 我知道这已经过时了 但我刚刚开始接受 Markdow
  • 将命令行参数传递给 pip install

    我目前正在开发一个导入 Fortran 模块的 Python 项目 这setup py看起来与那个类似 from numpy distutils core import Extension from numpy distutils core