gpt4 book ai didi

python - 通过 os.system 推送

转载 作者:IT老高 更新时间:2023-10-28 21:05:23 24 4
gpt4 key购买 nike

我正在使用 crontab 为我的 minecraft 服务器运行维护脚本。大多数时候它工作正常,除非 crontab 尝试使用重启脚本。如果我手动运行重新启动脚本,则没有任何问题。因为我相信它与路径名有关,所以我试图确保它总是从 minecraft 目录执行任何 minecraft 命令。所以我将命令封装在 pushd/popd 中:

os.system("pushd /directory/path/here")
os.system("command to sent to minecraft")
os.system("popd")

下面是一个交互式 session ,将我的世界从等式中剔除。一个简单的“ls”测试。如您所见,它根本没有从 pushd 目录运行 os.system 命令,而是从/etc/运行 python 来说明我的观点的目录。显然 pushd 不能通过 python 工作,所以我想知道我还能如何实现这一目标。谢谢!

>>> def test():
... import os
... os.system("pushd /home/[path_goes_here]/minecraft")
... os.system("ls")
... os.system("popd")
...
>>> test()
~/minecraft /etc
DIR_COLORS cron.weekly gcrypt inputrc localtime mime.types ntp ppp rc3.d sasldb2 smrsh vsftpd.ftpusers
DIR_COLORS.xterm crontab gpm-root.conf iproute2 login.defs mke2fs.conf ntp.conf printcap rc4.d screenrc snmp vsftpd.tpsave
X11 csh.cshrc group issue logrotate.conf modprobe.d odbc.ini profile rc5.d scsi_id.config squirrelmail vz
adjtime csh.login group- issue.net logrotate.d motd odbcinst.ini profile.d rc6.d securetty ssh warnquota.conf
aliases cyrus.conf host.conf java lvm mtab openldap protocols redhat-release security stunnel webalizer.conf
alsa dbus-1 hosts jvm lynx-site.cfg multipath.conf opt quotagrpadmins resolv.conf selinux sudoers wgetrc
alternatives default hosts.allow jvm-commmon lynx.cfg my.cnf pam.d quotatab rndc.key sensors.conf sysconfig xinetd.conf
bashrc depmod.d hosts.deny jwhois.conf mail named.caching-nameserver.conf passwd rc rpc services sysctl.conf xinetd.d
blkid dev.d httpd krb5.conf mail.rc named.conf passwd- rc.d rpm sestatus.conf termcap yum
cron.d environment imapd.conf ld.so.cache mailcap named.rfc1912.zones pear.conf rc.local rsyslog.conf setuptool.d udev yum.conf
cron.daily exports imapd.conf.tpsave ld.so.conf mailman netplug php.d rc.sysinit rwtab shadow updatedb.conf yum.repos.d
cron.deny filesystems init.d ld.so.conf.d makedev.d netplug.d php.ini rc0.d rwtab.d shadow- vimrc
cron.hourly fonts initlog.conf libaudit.conf man.config nscd.conf pki rc1.d samba shells virc
cron.monthly fstab inittab libuser.conf maven nsswitch.conf postfix rc2.d sasl2 skel vsftpd
sh: line 0: popd: directory stack empty

===(CentOS 服务器与 python 2.4)

最佳答案

在 Python 2.5 及更高版本中,我认为更好的方法是使用上下文管理器,如下所示:

import contextlib
import os


@contextlib.contextmanager
def pushd(new_dir):
previous_dir = os.getcwd()
os.chdir(new_dir)
try:
yield
finally:
os.chdir(previous_dir)

然后你可以像下面这样使用它:

with pushd('somewhere'):
print os.getcwd() # "somewhere"

print os.getcwd() # "wherever you started"

通过使用上下文管理器,您将是异常和返回值安全的:您的代码将始终 cd 回到它开始的位置,即使您抛出异常或从上下文 block 内部返回。

您还可以将 pushd 调用嵌套在嵌套 block 中,而不必依赖全局目录堆栈:

with pushd('somewhere'):
# do something
with pushd('another/place'):
# do something else
# do something back in "somewhere"

关于python - 通过 os.system 推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194499/

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