gpt4 book ai didi

python - 如何使用 fabric 在任意主机、多个平台、Linux 和 Windows 上创建文件夹/目录?

转载 作者:行者123 更新时间:2023-11-28 18:45:23 25 4
gpt4 key购买 nike

我正在使用 python fabric 编写一个多服务器维护模块,我遇到了一个问题,我需要在随机服务器上创建一个文件夹,这可以是 Linux 服务器或 Windows,所以这些机器上的命令是不同的。

然而,这可以在本地机器上使用 python 轻松完成,例如

if not os.path.exists(MyDir):
os.makedirs(MyDir)

但是如何在任意平台上使用 fabric 做一些事情呢?

我有这样的想法,

class FabricSupport:
def __init__(self):
pass

def run(self, host = 'localhost', port = '22', command = None):
if host != 'localhost':
env.host_string = "%s:%s" % (host, port)
with hide('output','running','warnings'):
return run(command, shell=False)
else:
with hide('running'):
return local(command)

所以我希望这个类可以有一个创建文件夹的功能。然后我发现在不同平台上运行时会遇到问题。

    def createdir(self, targetdir, host = 'localhost', port = '22'):
if host != 'localhost':
env.host_string = "%s:%s" % (host, port)
with hide('output','running','warnings'):
if not exists(targetdir):
return run('mkdir %s' % targetdir, shell=False)
else:
with hide('running'):
return local('mkdir %s' % targetdir)

我发现 fabric.contrib.files.exists 可以检查文件夹是否存在,但是创建一个怎么样?如果“mkdir”不起作用怎么办?

更新解决方案:

感谢 user865368,我在这里得到了完整的解决方案。这可能看起来很长,但我没有看到更好的。

class FabricRunReturnSimulator:
def __init__(self):
self.info = None
def __str__(self):
return "%s" % (self.info)
pass

def createdir(self, targetdir, host = 'localhost', port = '22'):
"""
Create a input target dir on local or remote.
targetdir can be a single string or a list (the sequence of the elements must follow the intended path)

return code 2: makedir runs into trouble, maybe permission problem
return code 3: target directory exists
return code 0: runs normal
"""

if host != 'localhost':
env.host_string = "%s:%s" % (host, port)
with hide('output','running','warnings'), settings(warn_only=True, shell=False):
if not isinstance(targetdir, list):
return run('''python -c "import os\nif not os.path.exists('%s'):\ntry:\n os.makedirs('%s')\nexcept: exit(2)" ''' % (targetdir, targetdir), capture=True)
else:
targetdirpass = repr(targetdir)
return run('''python -c "import os\ntd = os.path.join(*%s)\nif not os.path.exists(td):\ntry:\n os.makedirs(td)\nexcept: exit(2)" ''' % (targetdirpass), capture=True)
else:
simulatereturn = FabricRunReturnSimulator()
if not isinstance(targetdir, list):
if not os.path.exists(targetdir):
try:
os.makedirs('%s' % targetdir)
simulatereturn.return_code = 0
simulatereturn.failed = False
simulatereturn.succeeded = True
simulatereturn.info = ''.join((targetdir , " Folder Created."))
except:
simulatereturn.return_code = 2
simulatereturn.failed = True
simulatereturn.succeeded = False
simulatereturn.info = ''.join(("Unable to create folder ",targetdir))
else:
simulatereturn.return_code = 3
simulatereturn.failed = True
simulatereturn.succeeded = False
simulatereturn.info = ''.join((targetdir , " already exists."))
else:
td = os.path.join(*targetdir)
if not os.path.exists(td):
try:
os.makedirs('%s' % td)
simulatereturn.return_code = 0
simulatereturn.failed = False
simulatereturn.succeeded = True
simulatereturn.info = ''.join((td , " Folder Created."))
except:
simulatereturn.return_code = 2
simulatereturn.failed = True
simulatereturn.succeeded = False
simulatereturn.info = ''.join(("Unable to create folder " , td))
else:
simulatereturn.return_code = 3
simulatereturn.failed = True
simulatereturn.succeeded = False
simulatereturn.info = ''.join((td , " already exists."))
return simulatereturn

最佳答案

如果你想留在 Python 中,你可以继续执行

run('''python -c "import os;os.mkdir('some dir')" ''')

这需要您知道在每个系统上可执行的 python 的路径,该路径可以更改。

否则你可以这样做:

  1. 连接到主机
  2. 使用 detect_os 查找操作系统
  3. 根据操作系统分支
  4. 使用“mkdir”或“md”

无论如何,您都必须分支/检测操作系统,没有完全多平台的方法。

关于python - 如何使用 fabric 在任意主机、多个平台、Linux 和 Windows 上创建文件夹/目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21154542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com