0

我厌倦了(对我而言)更改 Apache 中的 DocumentRoot 所需的所有步骤。我正在尝试使用以下 Python 脚本来促进该过程...

#!/usr/bin/python

import sys, re

if len(sys.argv) == 2:
 f = open('/tmp/apachecdr', 'w')
 f.write(open('/etc/apache2/httpd.conf').read())

 f = open('/tmp/apachecdr', 'r')
 r = re.sub('DocumentRoot "(.*?)"', 
  'DocumentRoot "' + sys.argv[1] + '"', 
  f.read())
 f = open('/etc/apache2/httpd.conf', 'w')
 f.write(r)
else:
 print "Please supply the new DocumentRoot path."

我已经将它保存为 /usr/bin/apachecdr,这样我就可以简单地打开一个 shell 和“sudo apachecdr /new/documentroot/path”,然后用 apachectl 重新启动。我的问题是你会怎么写这个?

这是我第一次在 Stack Overflow 上发帖(而且我是 Python 新手),所以如果这个问题不够具体,请告诉我。

4

3 回答 3

0

谢谢你们的回答。内德,我希望你能说出这样的话。我这样做的原因仅仅是因为我不知道更好。感谢您提供您的代码,这正是我想要的。

顺便说一句,发生错误是因为“BACKUP”和“HTTPD_CONF”在第 8 行被颠倒了。换句话说,在第 8 行将“shutil.copyfile(BACKUP, HTTPD_CONF)”切换为“shutil.copyfile(HTTPD_CONF,BACKUP)”内德的剧本。

再次感谢各位!这是在这个网站上发布的第一次很棒的体验。

于 2009-09-12T00:44:51.817 回答
0

你做很多文件工作并没有太多好处。为什么你写 /tmp/apachecdr 然后马上又读了一遍?如果要将 httpd.conf 复制到 tmp 目录作为备份,shutil 模块提供了复制文件的功能:

#!/usr/bin/python

import shutil, sys, re

HTTPD_CONF = '/etc/apache2/httpd.conf'
BACKUP = '/tmp/apachecdr'
if len(sys.argv) == 2:
 shutil.copyfile(BACKUP, HTTPD_CONF)
 conf = open(HTTPD_CONF).read()

 new_conf = re.sub('DocumentRoot "(.*?)"', 
  'DocumentRoot "' + sys.argv[1] + '"', 
  conf)
 open(HTTPD_CONF, 'w').write(new_conf)
else:
 print "Please supply the new DocumentRoot path."
于 2009-09-11T01:16:56.143 回答
0

一般来说,Python 程序员更喜欢显式而不是隐式(参见http://www.python.org/dev/peps/pep-0020/)。考虑到这一点,您可能需要重写这一行

f.write(open('/etc/apache2/httpd.conf').read())

至:

infile = open('/etc/apache2/httpd.conf').read()
f.write(infile)
infile.close()

另一个建议是添加一些错误检查。例如检查文件 /etc/apache2/httpd.conf 是否存在。

通常人们会在打开的行周围使用 try/except,但如果您想使用组合的读取和写入命令,您可以使用 os.stat 进行检查。

例子

import os
try:
  os.stat('/etc/apache2/httpd.conf) 
except OSError:
  print "/etc/apache2/httpd.conf does not exist"
  return #will exit the program
于 2009-09-11T01:28:07.710 回答