AMcoder - javascript, python, java, html, php, sql

ենթագործընթացը կոտրում է խողովակները և ֆայլը զբաղված է

Ես փորձում եմ ֆայլային համակարգի որոշ գործեր կատարել 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-ում

29.10.2014

  • Կարող է օգնել, եթե ներառեք նաև օգտագործված Python-ի և find տարբերակը: Նկատի ունեցեք նաև, որ f.close()-ի փոխարեն ունեք f.close (տառասխա՞լ): 29.10.2014
  • Արդյո՞ք ./cmd.sh-ը դեռ բաց է գրելու գործողությունների համար: 29.10.2014
  • փակեք ֆայլը: Մեկ այլ օրինակ, թե ինչու պետք է օգտագործեք with ֆայլերը բացելու համար 29.10.2014
  • Դուք բացակայում եք ()_ից f.close-ից հետո: 29.10.2014
  • շնորհակալություն բոլորին, լավ պատասխաններ գումարած որոշ բոնուս (օգտագործեք «բացի հետ») 06.11.2014

Պատասխանները:


1

Սխալը, որը դուք հանդիպում եք, տեղի է ունենում, քանի որ դուք փորձում եք կատարել սցենարը, քանի դեռ այն բաց է գրելու համար: Մասնավորապես, տես հետևյալ նվազագույն օրինակը.

#!/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 գործիքը կանչելու փոխարեն:

29.10.2014

2

«Կոտրված խողովակի» սխալը նորմալ է և ակնկալվում է այն ամենի համար, ինչ խողովակները տանում են head կամ նմանատիպ այլ ծրագրեր:

Իրերը մի փոքր քանդելով,

  1. Առաջին գործընթացը սկսում է գրել խողովակին
  2. Գործընթացը երկրորդը սկսում է կարդալ խողովակից
  3. Մշակեք երկու ավարտ և փակեք խողովակը
  4. Առաջին գործընթացը փորձում է ավելի շատ տվյալներ գրել խողովակին

Երբ դուք չունեք շատ արդյունք, (4) երբեք տեղի չի ունենում, այնպես որ դուք անընդհատ չեք տեսնում այս սխալը: Բայց դա նորմալ է ու սպասելի։

Ես, այնուամենայնիվ, կկարգավորեի head մասը հենց Python-ում: Այնուհետև դուք կարող եք նաև վերացնել shell=True-ը:

find = subprocess.Popen(['find', rootDir + '/' + str(k), '-type', 'f'],
    stdout=subprocess.PIPE)
result = [find.stdout.readline() for x in xrange(10)]
find.terminate()
with open('negatives' + str(i) + 'txt', 'w') as output:
    output.write(''.join(result))

(Ձեր -iname "*" փաստարկը find-ին, կարծես թե որևէ օգտակար նպատակի չի ծառայում, ուստի ես այն բաց թողեցի:)

Ճակատագրի հեգնանքով սա մի փոքր ավելի անթափանց է Python-ում, քան «բարդ» shell script-ում: Իհարկե, մաքուր Python-ում դուք կօգտագործեիք os.walk()find-ի փոխարեն:

29.10.2014
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..