在 Python 中运行 Bash 命令

2024-07-04

在我的本地计算机上,我运行一个包含此行的 python 脚本

bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
os.system(bashCommand)

这很好用。

然后我在服务器上运行相同的代码,并收到以下错误消息

'import site' failed; use -v for traceback
Traceback (most recent call last):
File "/usr/bin/cwm", line 48, in <module>
from swap import  diag
ImportError: No module named swap

所以我当时所做的是插入一个print bashCommand在运行它之前,它会在终端中打印我的命令os.system().

当然,我再次收到错误(由os.system(bashCommand))但在出现该错误之前,它会在终端中打印该命令。然后我复制了该输出并将其复制粘贴到终端中,然后按 Enter 键,它就可以工作了......

有人知道发生了什么事吗?


为了稍微扩展一下之前的答案,有许多细节通常被忽视。

  • Prefer subprocess.run() over subprocess.check_call()和朋友过来subprocess.call() over subprocess.Popen() over os.system() over os.popen()
  • 了解并可能使用text=True, aka universal_newlines=True.
  • 理解其含义shell=True or shell=False以及它如何改变引用以及 shell 便利性的可用性。
  • 了解之间的差异sh和猛击
  • 了解子流程如何与其父流程分离,并且通常无法更改父流程。
  • 避免将 Python 解释器作为 Python 的子进程运行。

下面将更详细地介绍这些主题。

Prefer subprocess.run() or subprocess.check_call()

The subprocess.Popen()函数是低级主力,但正确使用很棘手,您最终会复制/粘贴多行代码......这些代码已经作为一组用于各种目的的高级包装函数方便地存在于标准库中,这下面将更详细地介绍。

这是来自文档 https://docs.python.org/3/library/subprocess.html#using-the-subprocess-module:

调用子流程的推荐方法是使用run()函数适用于它可以处理的所有用例。对于更高级的用例,底层Popen接口可以直接使用。

不幸的是,这些包装函数的可用性因 Python 版本而异。

  • subprocess.run()在Python 3.5中正式引入。它旨在取代以下所有内容。
  • subprocess.check_output()在 Python 2.7 / 3.1 中引入。基本上相当于subprocess.run(..., check=True, stdout=subprocess.PIPE).stdout
  • subprocess.check_call()在 Python 2.5 中引入。基本上相当于subprocess.run(..., check=True)
  • subprocess.call()最初是在Python 2.4中引入的subprocess模块 (PEP-324 https://www.python.org/dev/peps/pep-0324/)。基本上相当于subprocess.run(...).returncode

高级 API 与subprocess.Popen()

重构和扩展subprocess.run()比它所取代的旧遗留功能更具逻辑性和通用性。它返回一个CompletedProcess https://docs.python.org/3/library/subprocess.html#subprocess.CompletedProcess对象,它具有各种方法,允许您从已完成的子流程中检索退出状态、标准输出以及一些其他结果和状态指示器。

subprocess.run()如果您只需要运行一个程序并将控制权返回给 Python,那么这是一个可行的方法。对于更多涉及的场景(后台进程,可能与 Python 父程序进行交互式 I/O),您仍然需要使用subprocess.Popen()并亲自负责所有管道。这需要对所有活动部件有相当复杂的了解,并且不应掉以轻心。比较简单的Popen object https://docs.python.org/3/library/subprocess.html#subprocess.Popen表示(可能仍在运行的)进程,需要在子进程的剩余生命周期中通过代码进行管理。

或许应该强调的是,仅仅subprocess.Popen()只是创建一个过程。如果你就这样,你就会有一个与 Python 同时运行的子进程,因此是一个“后台”进程。如果它不需要进行输入或输出或以其他方式与您协调,它可以与您的 Python 程序并行执行有用的工作。

Avoid os.system() and os.popen()

自时间永恒以来(好吧,自Python 2.5以来)os模块文档 https://docs.python.org/release/2.5.2/lib/os-process.html已包含首选的建议subprocess over os.system():

The subprocess模块提供了更强大的工具来生成新进程并检索其结果;使用该模块比使用此功能更好。

存在的问题system()它显然是依赖于系统的,并且不提供与子流程交互的方法。它只是运行,标准输出和标准错误超出了 Python 的范围。 Python 收到的唯一信息是命令的退出状态(零表示成功,尽管非零值的含义也有些系统相关)。

PEP-324 https://www.python.org/dev/peps/pep-0324/(上面已经提到过)包含更详细的理由os.system有问题以及如何subprocess尝试解决这些问题。

os.popen()曾经更多强烈劝阻 https://docs.python.org/2/library/os.html#os.popen:

自 2.6 版本起已弃用:此功能已过时。使用subprocess module.

然而,从 Python 3 开始,它被重新实现为简单地使用subprocess,并重定向到subprocess.Popen()文档了解详细信息。

了解并经常使用check=True

你还会注意到subprocess.call()有许多相同的限制os.system()。在日常使用中,一般应该检查该过程是否成功完成,这subprocess.check_call() and subprocess.check_output()do(后者还返回已完成子流程的标准输出)。同样,您通常应该使用check=True with subprocess.run()除非您特别需要允许子进程返回错误状态。

在实践中,与check=True or subprocess.check_*,Python会抛出一个CalledProcessError例外 https://docs.python.org/3/library/subprocess.html#subprocess.CalledProcessError如果子进程返回非零退出状态。

一个常见的错误是subprocess.run()是省略check=True如果子流程失败,下游代码也会失败,您会感到惊讶。

另一方面,一个常见的问题是check_call() and check_output()是盲目使用这些功能的用户在引发异常时感到惊讶,例如什么时候grep没有找到匹配项。 (你可能应该替换grep无论如何,使用本机 Python 代码,如下所述。)

重要的是,您需要了解 shell 命令如何返回退出代码,以及在什么条件下它们将返回非零(错误)退出代码,并有意识地决定应该如何处理它。

了解并可能使用text=True aka universal_newlines=True

从 Python 3 开始,Python 内部的字符串是 Unicode 字符串。但不能保证子进程会生成 Unicode 输出或根本字符串。

(如果差异不是很明显,Ned Batchelder 的实用的统一码 https://nedbatchelder.com/text/unipain.html推荐(如果不是完全强制)阅读。如果您愿意,链接后面有一个 36 分钟的视频演示,不过您自己阅读该页面可能会花费更少的时间。)

在内心深处,Python 必须获取一个bytes缓冲并以某种方式解释它。如果它包含二进制数据块,那么它不应该被解码为 Unicode 字符串,因为这是容易出错和引发错误的行为 - 正是这种令人讨厌的行为,在有一种方法可以正确区分编码文本和二进制数据之前,困扰着许多 Python 2 脚本。

With text=True,你告诉Python,事实上,你期望以系统默认编码返回文本数据,并且应该尽Python的能力将其解码为Python(Unicode)字符串(在任何中等最新的版本上通常为UTF-8)系统,也许 Windows 除外?)

如果那是not你请求返回什么,Python 就会给你bytes中的字符串stdout and stderr字符串。也许在稍后的某个时刻你do知道它们毕竟是文本字符串,并且您知道它们的编码。然后,您可以对它们进行解码。

normal = subprocess.run([external, arg],
    stdout=subprocess.PIPE, stderr=subprocess.PIPE,
    check=True,
    text=True)
print(normal.stdout)

convoluted = subprocess.run([external, arg],
    stdout=subprocess.PIPE, stderr=subprocess.PIPE,
    check=True)
# You have to know (or guess) the encoding
print(convoluted.stdout.decode('utf-8'))

Python 3.7 引入了更短、更具描述性和易于理解的别名text对于以前被称为有点误导性的关键字参数universal_newlines.

理解shell=True vs shell=False

With shell=True您将单个字符串传递给 shell,shell 从那里获取它。

With shell=False您绕过 shell 将参数列表传递给操作系统。

当你没有 shell 时,你可以保存一个进程并删除一个进程相当大量的隐藏复杂性,可能会也可能不会存在错误,甚至安全问题。 /questions/3172470/actual-meaning-of-shell-true-in-subprocess

另一方面,当您没有 shell 时,您就没有重定向、通配符扩展、作业控制和大量其他 shell 功能。

一个常见的错误是使用shell=True然后仍然向 Python 传递一个标记列表,反之亦然。这在某些情况下确实有效,但定义确实不明确,并且可能会以有趣的方式破坏。

# XXX AVOID THIS BUG
buggy = subprocess.run('dig +short stackoverflow.com')

# XXX AVOID THIS BUG TOO
broken = subprocess.run(['dig', '+short', 'stackoverflow.com'],
    shell=True)

# XXX DEFINITELY AVOID THIS
pathological = subprocess.run(['dig +short stackoverflow.com'],
    shell=True)

correct = subprocess.run(['dig', '+short', 'stackoverflow.com'],
    # Probably don't forget these, too
    check=True, text=True)

# XXX Probably better avoid shell=True
# but this is nominally correct
fixed_but_fugly = subprocess.run('dig +short stackoverflow.com',
    shell=True,
    # Probably don't forget these, too
    check=True, text=True)

常见的反驳“但这对我有用”并不是一个有用的反驳,除非你确切地了解在什么情况下它会停止工作。

简单回顾一下,正确的用法看起来像

subprocess.run("string for 'the shell' to parse", shell=True)
# or
subprocess.run(["list", "of", "tokenized strings"]) # shell=False

如果您想避免使用 shell,但又太懒或不确定如何将字符串解析为标记列表,请注意shlex.split()可以为你做这件事。

subprocess.run(shlex.split("no string for 'the shell' to parse"))  # shell=False
# equivalent to
# subprocess.run(["no", "string", "for", "the shell", "to", "parse"])

常规的split()在这里不起作用,因为它不保留引用。在上面的示例中,请注意如何"the shell"是单个字符串。

重构示例

很多时候,shell 的功能可以用本机 Python 代码替换。简单的 awk 或sed脚本可能应该直接翻译为 Python。

为了部分说明这一点,这里有一个典型但有点愚蠢的示例,其中涉及许多 shell 功能。

cmd = '''while read -r x;
   do ping -c 3 "$x" | grep 'min/avg/max'
   done <hosts.txt'''

# Trivial but horrible
results = subprocess.run(
    cmd, shell=True, universal_newlines=True, check=True)
print(results.stdout)

# Reimplement with shell=False
with open('hosts.txt') as hosts:
    for host in hosts:
        host = host.rstrip('\n')  # drop newline
        ping = subprocess.run(
             ['ping', '-c', '3', host],
             text=True,
             stdout=subprocess.PIPE,
             check=True)
        for line in ping.stdout.split('\n'):
             if 'min/avg/max' in line:
                 print('{}: {}'.format(host, line))

这里需要注意一些事项:

  • With shell=False你不需要 shell 需要的字符串周围的引号。无论如何加引号可能是一个错误。
  • 在子进程中运行尽可能少的代码通常是有意义的。这使您可以更好地控制 Python 代码中的执行。
  • 话虽如此,在 Python 中重新实现复杂的 shell 管道非常乏味,有时甚至具有挑战性。

重构的代码还通过非常简洁的语法说明了 shell 真正为您做了多少事情——无论好坏。蟒蛇说显式优于隐式但是Python代码is相当冗长,并且可以说看起来比实际情况更复杂。另一方面,它提供了许多可以让您在其他事情中间获取控制权的点,例如我们可以轻松地将主机名与 shell 命令输出一起包含在内的增强功能。 (这在 shell 中也绝不具有挑战性,但代价是又一次转移,也许还有另一个进程。)

常见的外壳结构

为了完整起见,这里简要解释了其中一些 shell 功能,以及一些关于如何用本机 Python 工具替换它们的注释。

  • 通配符扩展又名通配符扩展可以替换为glob.glob()或者经常使用简单的 Python 字符串比较,例如for file in os.listdir('.'): if not file.endswith('.png'): continue。 Bash 还有各种其他扩展工具,例如.{png,jpg}支撑扩张和{1..100}以及波形符扩展(~扩展到您的主目录,更一般地说~account到另一个用户的主目录)
  • 外壳变量如$SHELL or $my_exported_var有时可以简单地用 Python 变量替换。导出的 shell 变量可用,例如os.environ['SHELL'](的含义export是使变量可用于子进程——子进程不可使用的变量显然不可用于作为 shell 子进程运行的 Python,反之亦然。这env=关键字参数subprocess方法允许您将子进程的环境定义为字典,因此这是使 Python 变量对子进程可见的一种方法。和shell=False您需要了解如何删除任何引号;例如,cd "$HOME"相当于os.chdir(os.environ['HOME'])目录名称周围不带引号。 (常常cd无论如何,没有用处或没有必要,许多初学者省略了变量周围的双引号并侥幸逃脱直到有一天 ... /questions/10067266/when-to-wrap-quotes-around-a-shell-variable)
  • 重定向允许您从文件中读取作为标准输入,并将标准输出写入文件。grep 'foo' <inputfile >outputfile opens outputfile用于写作和inputfile用于读取,并将其内容作为标准输入传递给grep,其标准输出然后落在outputfile。这通常并不难用本机 Python 代码替换。
  • 管道是重定向的一种形式。echo foo | nl运行两个子进程,其中标准输出echo是标准输入nl(在操作系统级别,在类 Unix 系统中,这是单个文件句柄)。如果您无法用本机 Python 代码替换管道的一端或两端,也许可以考虑使用 shell,特别是当管道有两个或三个以上进程时(尽管看看pipesPython 标准库中的模块 https://docs.python.org/3.7/library/pipes.html或一些更现代、更通用的第三方竞争对手)。
  • 作业控制允许您中断作业、在后台运行它们、将它们返回到前台等。停止和继续进程的基本 Unix 信号当然也可以从 Python 获得。但作业是 shell 中的更高级别的抽象,它涉及进程组等,如果你想从 Python 中执行类似的操作,则必须了解这些内容。
  • 在 shell 中引用可能会令人困惑,直到您理解这一点一切基本上是一个字符串。所以ls -l /相当于'ls' '-l' '/'但对文字的引用是完全可选的。包含 shell 元字符的不带引号的字符串会经历参数扩展、空格标记化和通配符扩展;双引号可防止空格标记化和通配符扩展,但允许参数扩展(变量替换、命令替换和反斜杠处理)。这在理论上很简单,但可能会令人困惑,特别是当存在多层解释时(例如远程 shell 命令)。

了解之间的差异sh和猛击

subprocess运行你的 shell 命令/bin/sh除非您另有特别要求(当然在 Windows 上除外,它使用COMSPEC多变的)。这意味着各种仅 Bash 的功能,例如数组,[[ etc /a/42666651/874188不可用。

如果您需要使用仅限 Bash 的语法,您可以 将路径传递给 shell 作为executable='/bin/bash'(当然,如果你的 Bash 安装在其他地方,你需要调整路径)。

subprocess.run('''
    # This for loop syntax is Bash only
    for((i=1;i<=$#;i++)); do
        # Arrays are Bash-only
        array[i]+=123
    done''',
    shell=True, check=True,
    executable='/bin/bash')

A subprocess与其父级分离,并且无法更改它

一个常见的错误是做类似的事情

subprocess.run('cd /tmp', shell=True)
subprocess.run('pwd', shell=True)  # Oops, doesn't print /tmp

如果第一个子进程尝试设置环境变量,也会发生同样的事情,当您运行另一个子进程等时,该环境变量当然会消失。

子进程完全独立于 Python 运行,当它完成时,Python 不知道它做了什么(除了它可以从子进程的退出状态和输出推断出的模糊指示符之外)。孩子通常无法改变父母的环境;它无法设置变量、更改工作目录,或者,换句话说,在没有父级合作的情况下,无法与其父级进行通信。

在这种特殊情况下,立即解决的方法是在单个子进程中运行这两个命令;

subprocess.run('cd /tmp; pwd', shell=True)

尽管显然这个特定的用例不是很有用;相反,使用cwd关键字参数,或者简单地os.chdir()在运行子进程之前。类似地,为了设置变量,您可以通过以下方式操纵当前进程(及其子进程)的环境

os.environ['foo'] = 'bar'

或将环境设置传递给子进程

subprocess.run('echo "$foo"', shell=True, env={'foo': 'bar'})

(更不用说明显的重构subprocess.run(['echo', 'bar']); but echo当然,这首先是在子进程中运行的一个糟糕的例子)。

不要从 Python 运行 Python

这是一个有点可疑的建议;当然,在某些情况下,将 Python 解释器作为 Python 脚本的子进程运行确实有意义,甚至是绝对要求。但很多时候,正确的方法就是import将另一个 Python 模块添加到您的调用脚本中并直接调用其函数。

如果其他 Python 脚本在您的控制之下,并且它不是模块,请考虑将其化为一 /questions/15746675/how-to-write-a-python-module-package。 (这个答案已经太长了,所以我不会在这里深入探讨细节。)

如果需要并行性,可以使用以下命令在子进程中运行 Python 函数multiprocessing module. https://docs.python.org/3/library/multiprocessing.html?highlight=multiprocessing还有threading https://docs.python.org/3/library/threading.html#module-threading它在单个进程中运行多个任务(它更轻量级,为您提供更多控制,但也更受限制,因为进程中的线程紧密耦合,并绑定到单个进程)GIL https://docs.python.org/3/glossary.html#term-global-interpreter-lock.)

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

在 Python 中运行 Bash 命令 的相关文章

  • 将今天日期设置为模型中的默认值

    如何在模型中将默认值设置为今天日期 我的型号 vote date models DateField 投票日期 null False Blank False 所有答案都不能解决最初的问题 重述问题 如何将日期字段的默认值设置为今天的日期并仍然
  • Windows:Apache Spark 历史服务器配置

    我想使用 Spark 的 History Server 来利用 Web UI 的日志记录机制 但我发现在 Windows 计算机上运行此代码有些困难 我做了以下事情 设置我的 Spark defaults conf 文件以反映 spark
  • pandas 预期第 153 行有 10 个字段,看到 11 个字段,如何再添加一列

    我有一个 info txt 文件 它看起来像这样 B 19960331 00100000 00000000000000 00000000000000 00000000000000 00000000 00000000000000 000000
  • 使用 bs4 进行 HTML 解析

    我正在解析一个 HTMl 页面 并且很难弄清楚如何在没有类或 id 的情况下提取某个 p 标签 我试图用经纬度到达 p 标签 这是我当前的代码 import bs4 from urllib import urlopen as uReq th
  • 如何使用Python读取MP3中的ID3标签? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有人有在 MP3 文件或 WMA 文件中读写 ID3 标签的经验吗 有一些库 但我想从头开始 深入Python https web a
  • 熊猫读_csv。如何忽略换行符之前的分隔符

    我正在读取一个包含数值的文件 data pd read csv data dat sep header None 在文本文件中 每行以空格结尾 因此 pandas 等待不存在的值 并在每行末尾添加一个 nan 例如 2 343 4 234
  • Pandas:处理测试中看不见的数据

    我有一个训练数据集 正在构建一些机器学习模型 我无权访问测试集 并且想要处理在训练中未观察到测试中的分类特征之一的可能性 这是一个玩具示例 说明了我的意思 我有一个数据框 old 像这样 old pd DataFrame car Audi
  • django value_list 外键中所有字段

    我有一个类 它有另一个类的外键 class MyEvent models Model msg models ForeignKey MyMessage event type models IntegerField choices EVENTS
  • Asyncio 函数在从脚本调用时有效,但在 Flask 路由中无效

    我是 Python 和这些库 模块的新手 我正在编写一个简单的 ping 测试网络扫描仪作为学习项目 我首先使用 asyncio 开发了一个脚本来 ping 网络上的地址 ip test py import asyncio import i
  • 上传大文件nginx + uwsgi

    堆栈 flask 0 10 uwsgi 1 4 5 nginx 1 2 3 我可以通过我的应用程序上传小文件 CONTENT LENGTH 无效 太大 跳过 nginx 日志没有显示任何有用的内容 我尝试了以下操作 但没有成功 nginx配
  • BeautifulSoup 3.1 解析器太容易崩溃

    我在使用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦 事实证明 新版本中使用的 HTMLParser 的容忍度低于以前使用的 SGMLParser BeautifulSoup 有某种调试模式吗 我正在尝试找出如何阻
  • Python 中的 HTML 解析器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用Python文档我发现了HTML解析器 http docs python org lib modu
  • Numpy,沿数组维度应用函数列表

    我有一个类型的函数列表 func list lambda x function1 input lambda x function2 input lambda x function3 input lambda x x 和形状为 4 200 2
  • Django 会话竞争条件?

    摘要 Django 会话中是否存在竞争条件 如何防止它 我在 Django 会话方面遇到了一个有趣的问题 我认为该问题涉及由于同一用户同时发出请求而导致的竞争条件 它发生在一个同时上传多个文件的脚本中 正在本地主机上进行测试 我认为这使得同
  • 将 LIVE SPEECH 与 Tkinter GUI 连接

    我想将 pocketsphinx livespeech 与 Python tkinter GUI 连接起来 这样 GUI 在前端可见 而 Livespeech 在后端工作 但是当我将 tkinter 代码与 livespeech 代码合并时
  • 如何编写一个 SQLAlchemy 查询来返回图中节点的所有后代?

    我正在开发一个应用程序 其中我的数据库对象通常有多个父级和多个子级 并且希望创建一个 SQLAlchemy 查询来返回对象的所有后代 意识到我基本上是在尝试将图形存储在 SQL 数据库中 我发现设置一个自引用多对多模式 http docs
  • Python:汇总和聚合 DataFrame 中的组和子组

    我正在尝试构建一个表 其中的组按子组划分 并包含每个子组的计数和平均值 例如 我想转换以下数据框 到一个看起来像这样的表 其中interval是一个更大的组和列a thru i成为组内的子组 每个单元格中具有相应子组的计数和平均值 我尝试过
  • 过滤(减少)NumPy 数组

    假设我有一个 NumPy 数组arr我想根据 可广播 函数的真值进行逐元素过滤 减少 例如 我只想获取低于某个阈值的值k def cond x return x lt k 有几种方法 例如 使用发电机 np fromiter x for x
  • Python 与 Hive 的连接

    我安装了 Hortonworks Hive ODBC 驱动程序并在数据源中创建了连接 我测试了它并且成功了 我安装了PyODBC并编写了以下代码 import os sys pyodbc con pyodbc connect DSN MyC
  • 在Python中返回外部函数错误

    这就是问题 给定以下 Python 程序 假设用户从键盘输入数字 4 返回的值是多少 N int input enter a positive integer counter 1 while N gt 0 counter counter N

随机推荐

  • Actionscript 3 中循环的变量声明性能

    尽管所有关于这个问题的已知博客我总是怀疑一些结果 而且我的个人测试表明 所说的标准并不是最好的 在循环内部声明变量 使它们接近其范围并使其更快地被方法访问 但分配更多内存或在循环外部声明for范围可以节省内存分配 但增加处理以在远程实例中进
  • Java:什么是“for (;;)”[重复]

    这个问题在这里已经有答案了 有人可以帮我解释一下这条指令吗 为了 我遇到过几种这样的标记 比如在 facebook 的 ajax 代码和 Java 的并发内容中 无限循环 for 循环的三个部分中的每一个部分 for x y z 是可选的
  • Android应用程序启动图标大小[重复]

    这个问题在这里已经有答案了 遵循 Google 的指南 我已将 48x48 和 72x72 启动器图标添加到我的 mdpi 和 hdpi 屏幕项目中 但在某些情况下 图标的大小会被调整 例如 在我的 Acer Iconia A200 平板电
  • 在 WCF 服务关闭之前执行操作

    我有一个托管在 IIS7 中的 WCF 服务 该服务有一个静态类 其中包含包含字符串 某种日志 的静态列表 它定期将条目写入文件或数据库 但是 当 IIS 决定回收应用程序或出于任何原因终止时 静态字段中的条目将丢失 有什么方法可以处理服务
  • 在 Bash 中使用大小写表示数字范围

    我正在尝试使用以下方法进行操作case在 Bash 中 在 Linux 中 如果X在460到660之间 则输出X信息 如果 X 介于 661 和 800 之间 请执行其他操作 Etc 现在这就是我所拥有的 case MovieRes in
  • 如何循环调用分页函数?

    我正在尝试使用空气桌API https airtable com api从我的数据中检索记录 具体来说 是我在列单元格中的 URL 列表 我写了一个函数 get airtable records 通过以下方式进行 API 调用curl它可以
  • OpenCV 2.4.6 SIFT 关键点检测使用大量内存

    我们在 openCV 2 4 3 中使用 SIFT 我们决定升级到 openCV 2 4 6 升级后 openCV 2 4 6 中的内存使用量从约 150MB 跃升至 1 2GB 有人知道这是一个错误还是我们现在需要配置的东西吗 我们的图像
  • PHP url 函数和子域

    我有一个网站thenoblesite com 它有一些子域 即 download thenoblesite com壁纸 thenoblesite com etc 子域的页面位于主 htdocs 文件夹中 即 httpdocs downloa
  • 字符串的两半就地交错

    给定一个字符串even尺寸 说 abcdef123456 我如何将两半交错 这样same字符串将变成这样 a1b2c3d4e5f6 我尝试开发一种算法 但失败了 有人能给我一些吗hints至于如何进行 我需要在不创建额外的字符串变量或数组的
  • Android CardView 不适用于 Api 21

    我正在使用安卓CardView它在 Api 21 下完美运行 但是当我在 Api 21 即 Lollipop 上使用它时 XML 属性如下cardElevation cornerRadius不起作用 我究竟做错了什么 这是我的 XML 布局
  • 如何解决“您的系统管理员已将 Chrome 配置为打开备用浏览器进行访问”

    我正在尝试在 google chrome 中打开一个应用程序 当我启动 chrome 网站时 它会重定向到 IE 并在 chrome 中显示消息 您的系统管理员已将 chrome 配置为打开备用浏览器进行访问 如何克服这个问题 Behavi
  • Socket:Python中的2路通信

    我想要在 Python 中进行双向通信 我想绑定到一个客户端可以连接的套接字 然后服务器和客户端可以彼此 聊天 我已经有了基本的监听器 import socket HOST localhost PORT 50008 s socket soc
  • 让所有街道在 Google 地图视口中可见

    我正在尝试使用以下算法构建地图 等待平移或缩放发生 查询视口中可见的所有街道 范围 使用预定义的颜色为每条可见街道着色 Example 我想显示每条街道上的企业数量 或者每条街道上发生的犯罪数量 我有一个数据库 其中包含此类信息 街道名称
  • PHAsset(或 ALAsset)跨设备标识符

    我实际上正在创建一个 iOS 应用程序 并且想要在 SQLite 数据库中存储有关照片库图片的一些详细信息 我还希望能够在用户拥有的不同设备上共享这些数据 想象一下有人想要在他的 iPhone 上重新组织图片 并想要在他的 iPad 上检索
  • 计算已发布字符串中的行数

    我试过这个 PHP 中计算文本区域中的新行以调整容器大小 https stackoverflow com questions 1743745 count new lines in textarea to resize container i
  • 没有可编译的体系结构(ARCHS=i386、VALID_ARCHS=arm64 armv7 armv7s)

    Preface 我确实看过类似的问题 https stackoverflow com questions 22328882 xcode 5 1 no architectures to compile for only active arch
  • 在 Scala 中指定 lambda 返回类型

    注意 这是一个理论问题 我并不是试图解决任何问题 也不是试图达到任何实际效果 在 Scala 中创建 lambda 时使用 arguments gt expression语法 可以显式提供返回类型吗 Lambda 与方法没有什么不同 它们都
  • String.Format() 中的 CultureInfo.CurrentCulture 真的有必要吗?

    您认为确实有必要提供哪些IFormatProvider在方法中String Format string object 写完整的变体是否更好 String Format CultureInfo CurrentCulture String is
  • 如何在Android 10及更高版本中通过intent MediaStore.ACTION_IMAGE_CAPTURE获取图像URI

    对于版主 我知道已经存在这样的问题 但所有这些方法最终都会通过提供位图data getExtra data 这实际上只是thumbnail 我想要获取 URI 而不是位图 并且我需要获取实际图像的 URI 而不是其缩略图 方法可在2021
  • 在 Python 中运行 Bash 命令

    在我的本地计算机上 我运行一个包含此行的 python 脚本 bashCommand cwm rdf test rdf ntriples gt test nt os system bashCommand 这很好用 然后我在服务器上运行相同的