9001是啥默认端口,启动docker run -it --name=mosquitto --privileged -p 1883:1883 -p 9001:9001?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9001是啥默认端口,启动docker run -it --name=mosquitto --privileged -p 1883:1883 -p 9001:9001?相关的知识,希望对你有一定的参考价值。
参考技术A 9001是supervisor程序启动的端口,supervisor是专门管理进程的软件。题主的命令是映射了1883和9001两个端口到宿主机上,1883是应用的端口,9001是管理程序的端口。
出现错误 - AttributeError: 'module' object has no attribute 'run' while running subprocess.run(["ls
【中文标题】出现错误 - AttributeError: \'module\' object has no attribute \'run\' while running subprocess.run(["ls", "-l"])【英文标题】:Getting an error - AttributeError: 'module' object has no attribute 'run' while running subprocess.run(["ls", "-l"])出现错误 - AttributeError: 'module' object has no attribute 'run' while running subprocess.run(["ls", "-l"]) 【发布时间】:2017-03-28 04:13:07 【问题描述】:我在 AIX 6.1 上运行并使用 Python 2.7。想要执行以下行,但出现错误。
subprocess.run(["ls", "-l"])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'run'
【问题讨论】:
subprocess
不应该(也不...)有一个名为 run
的方法。
@DeepSpace 在 Python 3 docs.python.org/3/library/subprocess.html#subprocess.run 中确实如此,但遗憾的是他们使用的是 Python 2
@MosesKoledoye 好吧,这个问题被标记为python 2.7
;)
2.7中没有subprocess.run()
函数,该函数是3.5版本新增的。
感谢 "subprocess.call(["pwd"])" 工作正常。
【参考方案1】:
接受的答案是无效代码,也没有与原始 (Python 3) 函数相同的返回值。然而,它足够相似,它不是 CC BY 4.0 Martijn Pieters,因为它是从 Python 复制的,并且如果任何许可适用于琐碎代码(我完全反对琐碎代码的许可,因为它阻碍了创新并证明所有权或独创性很难,因此 *** 可能会违反包括 GPL 在内的各种许可证,方法是通过重新许可人们粘贴并默认声明为自己的东西而不引用来源来增加额外的限制),这将在下面的 GitHub 链接中。如果代码不能以相同的方式使用,则不是“反向移植”。如果您尝试以 Python 3 方式使用它而不更改代码(使用该函数的客户端代码),您将只有“AttributeError:'tuple' 对象没有属性 'returncode'”。您可以更改您的代码,但它不会与 Python 3 兼容。
无论哪种方式,接受的答案本身的代码都不会运行,原因是:
“TypeError: init() got an unexpected keyword argument 'stderr'”(因为 stderr 在 2 或 3 中都不是“CalledProcessError”的参数)
“AttributeError: 'Popen' object has no attribute 'args'”(args 仅在 Python 3 中可用)
因此,请考虑更改接受的答案。
为了更加 Pythonic,利用鸭子类型和猴子补丁(您的客户端代码可以保持不变,并为 run 方法和返回的对象的类使用下面显示的不同定义),这里是一个兼容的实现Python 3:
import subprocess
try:
from subprocess import CompletedProcess
except ImportError:
# Python 2
class CompletedProcess:
def __init__(self, args, returncode, stdout=None, stderr=None):
self.args = args
self.returncode = returncode
self.stdout = stdout
self.stderr = stderr
def check_returncode(self):
if self.returncode != 0:
err = subprocess.CalledProcessError(self.returncode, self.args, output=self.stdout)
raise err
return self.returncode
def sp_run(*popenargs, **kwargs):
input = kwargs.pop("input", None)
check = kwargs.pop("handle", False)
if input is not None:
if 'stdin' in kwargs:
raise ValueError('stdin and input arguments may not both be used.')
kwargs['stdin'] = subprocess.PIPE
process = subprocess.Popen(*popenargs, **kwargs)
try:
outs, errs = process.communicate(input)
except:
process.kill()
process.wait()
raise
returncode = process.poll()
if check and returncode:
raise subprocess.CalledProcessError(returncode, popenargs, output=outs)
return CompletedProcess(popenargs, returncode, stdout=outs, stderr=errs)
subprocess.run = sp_run
# ^ This monkey patch allows it work on Python 2 or 3 the same way
此代码已使用我的 install_any.py 中适用于 Python 2 和 3 的测试用例进行了测试(请参阅 https://github.com/poikilos/linux-preinstall/tree/master/utilities)。
注意:该类没有相同的 repr 字符串,并且可能有其他细微差别(您可以根据其许可证在以下 URL 使用 Python 3 本身的真实代码 - 请参阅class CalledProcess in:https://github.com/python/cpython/blob/master/Lib/subprocess.py -- 如果有的话,该许可证也适用于我的代码,但我将它作为 CC0 发布,因为我认为它是微不足道的 -- 请参阅上面括号中的解释。
#IRejectTheInvalidAutomaticLicenseForMyPost
【讨论】:
【参考方案2】:subprocess.run()
function 仅存在于 Python 3.5 及更高版本中。
然而,向后移植很容易:
def run(*popenargs, **kwargs):
input = kwargs.pop("input", None)
check = kwargs.pop("handle", False)
if input is not None:
if 'stdin' in kwargs:
raise ValueError('stdin and input arguments may not both be used.')
kwargs['stdin'] = subprocess.PIPE
process = subprocess.Popen(*popenargs, **kwargs)
try:
stdout, stderr = process.communicate(input)
except:
process.kill()
process.wait()
raise
retcode = process.poll()
if check and retcode:
raise subprocess.CalledProcessError(
retcode, process.args, output=stdout, stderr=stderr)
return retcode, stdout, stderr
不支持超时,也不支持完成进程信息的自定义类,所以我只返回retcode
、stdout
和stderr
信息。否则它和原来的一样。
【讨论】:
它不喜欢在 popenargs 和 kwargs 之间输入和检查。 @jjcf89:我不确定如何处理这些信息。您是否希望看到不同的处理方式?这只是对传入参数的运行时检查,version in the standard library 的作用完全相同。 @MartijnPieters 我认为他是说在使用您的代码时它不会运行并引发错误,因为它与 Python 2.7 不兼容(以其当前形式)。它会引发invalid syntax
错误并指向input=None
行。
@frakman1 是的,因为在 Python 2 中你不能只使用 *args
和命名关键字参数。删除命名的关键字参数并在kwargs
中查找它们,而不是使用kwargs.pop()
。
@frakman1 我看到这个问题被标记为python2.7 所以我做了这个改变。以上是关于9001是啥默认端口,启动docker run -it --name=mosquitto --privileged -p 1883:1883 -p 9001:9001?的主要内容,如果未能解决你的问题,请参考以下文章