- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 python 来做一些文件系统的事情,因为我不想处理复杂的 shell 脚本并且宁愿尽可能将我的所有编程限制在 python 中。 “search_string”中的 shell 命令读取目录中的文件名并将前 10 个名称写入文件。
search_string = "find " + rootDir + "/"+str(k) +" -iname \"*\" -type f | head -10 >> negatives" + str(i) + ".txt"
print(search_string)
subprocess.call(search_string, shell=True)
此代码适用于我的 ubuntu 14.04 电脑,但不适用于最终必须运行的 aws,并给出错误:
find: `standard output': Broken pipe
find: write error
ubuntu@ip:$ uname -r
3.13.0-37-generic
所以我决定将长 shell 命令写入一个我认为很容易调用的文件(在使用 chmod 命令使 shell 脚本文件可执行之后):
search_string = "sudo find " + rootDir + "/"+str(k) +" -iname \"*\" -type f | head -10 >> trainingfiles/negatives" + str(i) + ".txt"
f=open("cmd.sh","w")
f.write(search_string)
f.flush()
os.fsync(f.fileno())
f.close
p1=subprocess.Popen(["chmod","+x","/home/www-data/web2py/applications/fingerPrint/modules/classifier_stuff/cmd.sh"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout, stderr = p1.communicate()
output = p1.communicate()[0]
print('stdout:'+stdout+' stderr:'+stderr)
sys.stdout.flush()
p2=subprocess.Popen(["sudo /home/www-data/web2py/applications/fingerPrint/modules/classifier_stuff/cmd.sh"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout, stderr = p2.communicate()
print('stdout:'+stdout+' stderr:'+stderr)
sys.stdout.flush()
但是我明白了
stdout: stderr:
Traceback (most recent call last):
File "prepare_and_train.py", line 56, in <module>
p2=subprocess.Popen(["/home/www-data/web2py/applications/fingerPrint/modules/classifier_stuff/cmd.sh"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 26] Text file busy
如果我将 PIPE 更改为 STDOUT,我会得到一个有趣的结果
OSError: [Errno 9] Bad file descriptor
当我尝试 subprocess.call 时同样的“文件忙”:
sudo: unable to execute ./cmd.sh: Text file busy
stdout: stderr:
我真的不在乎我是怎么做到的,我只想要工作代码 - 这里有什么提示吗?我(很可能)是 linux 的新手
最佳答案
您遇到的错误正在发生,因为您正试图在脚本仍处于打开状态以供写入时执行它。特别是,请参阅以下最小示例:
#!/usr/bin/env python
import os
f = open('f.sh', 'w')
f.write("#!/bin/sh\necho test")
os.chmod('f.sh', 0o755)
os.execl('f.sh', './f.sh')
如果你执行它,你会得到:
$ ./a.py
Traceback (most recent call last):
File "./a.py", line 8, in <module>
os.execl('f.sh', './f.sh')
File "/usr/lib64/python3.4/os.py", line 491, in execl
execv(file, args)
OSError: [Errno 26] Text file busy
如果您确保在执行前关闭文件,例如:
#!/usr/bin/env python
import os
with open('f.sh', 'w') as f:
f.write("#!/bin/sh\necho test")
os.chmod('f.sh', 0o755)
os.execl('f.sh', './f.sh')
它工作正常:
$ ./a.py
test
进入您的具体问题,第 6 行:
f.close
您缺少括号,因此您没有调用 close()
方法,您只是获取(而不是使用)它。那应该是:
f.close()
或者在我的例子中最好是 with
语句。
同时,您可能还想使用 os.chmod()
而不是调用外部 chmod
工具。
关于python - 子进程中断管道和文件忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26625166/
根据https://developers.google.com/google-apps/calendar/v3/reference/freebusy/query处的文档要执行空闲/忙碌查询,您必须在正
我在启动 Apache 后使用 XAMPP 1.7.7 我收到此警报: Busy... Apache started [Port 80] 我已经打开了 httpd.conf 文件,并将端口号更改为 8
我有端口问题。 每当我启动 Apache 时,它都会给我这个错误: Busy - Apache Started [port 80] 当我启动 Mysql 时出现以下错误: Busy - ERROR
当我运行我的代码时,我总是得到后台工作人员很忙。有帮助吗? struct FtpSetting { public string Server { get; set
在我们的 Android 和 iOS MVVMCross 应用程序中,我们偶尔会遇到 SQLiteException: busy 异常。 给定下面的代码,我们有几个存储库,每个存储库都构造一个下面的实
每次运行解决方案(20 projs)时,我都会收到此错误。我尝试禁用 UI 选项、resharper、删除未使用的扩展等,但仍然无法通过此错误。 我使用的是 VS 2015 Update 2 Ente
我正在使用这个插件 https://github.com/mozilla/rust-android-gradle ,这需要我添加 tasks.whenTaskAdded { task -> i
我是一名优秀的程序员,十分优秀!