Ես փորձում եմ ֆայլային համակարգի որոշ գործեր կատարել python-ի միջոցով, քանի որ չեմ ցանկանում զբաղվել բարդ shell scripting-ով և կնախընտրեի հնարավորինս սահմանափակել իմ ամբողջ ծրագրավորումը 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
այնպես որ ես որոշեցի գրել long shell հրամանը մի ֆայլի վրա, որը, իմ կարծիքով, հեշտ կլինի զանգահարել (shell script ֆայլը կատարելի դարձնելուց հետո chmod հրամանով).
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-ում