-1

私はEclipseでPythonコードを書いていて、ダウンロードフォルダにあるファイルを開きたいと思っています. MAC OSX 10.8.2 を使用しています。と一緒に試してみましf=os.path.expanduser("~/Downloads/DeletingDocs.txt")

ss=subprocess.Popen("~/Downloads/DeletingDocs.txt",shell=True)
ss.communicate()

私は基本的にサブプロセスでファイルを開き、開いたファイルの変更をリッスンしたいのですが、どちらの場合もファイルは開いていません。

4

3 に答える 3

4
from os.path import baspath, expanduser
filepath = abspath(expanduser("~/") + '/Downloads/DeletingDocs.txt')
print('Opening file', filepath)
with open(filepath, 'r') as fh:
    print(fh.read())

OSX のファイル処理に注意してください。ファイルの種類によって IO が少し異なります。たとえば、.txtWindows では「プレーン テキスト ファイル」と見なされるファイルは、OSX ではストレージ スペースを「賢く」しようとするため、実際には OSX では圧縮されたデータ ストリームです。

あなたがそれについて知らない限り、これは文字通りあなたの一日を台無しにする可能性があります(そこにいて、頭痛がした..先に進みました)

たとえば、OSX でファイルをダブルクリックすると、.txt通常、テキスト エディターがポップアップし、それが行うことはos.open()、OSX 中間層が実行できるようにする下位レベルでアクセスする代わりに、を呼び出すdisk-area|decompression pipe|file-handle -> Texteditorことですが、下位レベルでは、ファイルが保存されているディスク領域を開くことになり、データを印刷すると、期待するデータではないため、ゴミが発生します。

だから使ってみてください:

import os
fd = os.open( "foo.txt", os.O_RDONLY )
print(os.read(fd, 1024))
os.close( fd )

そして、フラグをいじります。open()正直なところ、どちらがディスクからファイルをそのまま開くか(または)覚えていませんが、os.open()そのうちの1つはデータをゴミのように見せ、時には解凍パイプへのポインタを取得するだけです(4バイトのデータが好きです)テキストファイルが巨大であっても)。

必要なファイルの更新を追跡/キャッチしている場合

from time import ctime
from os.path import getmtime, expanduser, abspath
from os import walk

for root, dirs, files in walk(expanduser('~/')):
    for fname in files:
        modtime = ctime(getmtime(abspath(root + '/' + fname)))
        print('File',fname,'was last modified at',modtime)

そして、時間が前回のチェックと異なる場合は、それで何かクールなことをしてください. たとえば、Python で動作するこれらのライブラリがあります。

さらに多くの場合、最初の修正として外部アプリケーションを開く代わりに、Python 経由でそれらを開いて好みに合わせて変更し、最後の手段としてのみ (もしそうなら) Popen 経由で外部アプリケーションを開きます。

しかし、あなたがそれを要求したので(一種の... erm)、ここにPopen アプローチがあります:

from subprocess import Popen, PIPE, STDOUT
from os.path import abspath, expanduser
from time import sleep

run = Popen('open -t ' + abspath(expanduser('~/') + '/example.txt'), shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)

##== Here's an example where you could interact with the process:
##== run.stdin.write('Hey you!\n')
##== run.stdin.flush()

while run.poll() == None:
    sleep(1)

自分の仕事を過剰に説明する:

これにより、変更されるたびにファイルの内容が出力されます。

with open('test.txt', 'r') as fh:
    import time
    while 1:
            new_data = fh.read()
            if len(new_data) > 0:
                fh.seek(0)
                print(fh.read())
            time.sleep(5)

仕組み: 通常のファイル オープナーwith open() as fhは、ファイルを開き、ハンドルとして に配置します。パラメーターを指定せずfhに呼び出すと、ファイルの内容全体が取得されます。.read()これは、ファイルを閉じるのではなく、単に「読み取り」ポインターをファイルの後ろに配置します (便宜上、位置 50 としましょう)。

これで、ポインターはファイルの最後の文字 50 にあります。ファイルに何かを書き込むたびに、より多くのデータが書き込まれるため、次.read()は位置 50+ からデータを取得して.read()空ではないため、発行して「読み取り」ポインターを位置 0 に戻し、.seek(0)すべてを出力します。データ。

それを組み合わせて、os.path.getmtime()逆の変更または 1:1 の比率の変更 (文字のスペルミスの置換など) を微調整します。

于 2013-10-09T13:32:39.043 に答える
2

この質問は二重投稿されており、紛らわしい言い回しであるため、答えるのをためらっていますが...デフォルトのエディターを使用してOSXでファイルを「開く」場合はopen、サブプロセスにコマンドを追加してください。これは私のために働く:

subprocess.Popen("open myfile.txt",shell=True)
于 2013-10-10T20:39:17.290 に答える
0

これはパーミッションの問題である可能性が最も高く、Python インタープリターでコードを試すと、subprocess.Popen を呼び出したときにシェルから「パーミッションが拒否されました」というエラーが表示される可能性があります。この場合、ファイルを最小で 700 (デフォルトではおそらく 644) にする必要があり、おそらく 744 が必要になるでしょう。

Python インタープリターでコードを試して、「許可が拒否されました」というエラーがないかどうかを確認してください。エラーが表示された場合は、シェルで次の操作を行います。

chmod 744 ~/Downloads/DeletingDocs.txt

次に、スクリプトを実行します。Python ですべてを行うには、os.system を使用できます。

import os
import subprocess

filename = "~/Downloads/DeletingDocs.txt"
os.system("chmod 744 "+filename)
ss=subprocess.Popen(filename, shell=True)
ss.communicate()

それが Windows で「うまくいく」理由は、Windows が *nix システム (Linux、BSD、OS X など) と同じようにファイル許可タイプ (読み取り、書き込み、実行) をサポートしていないためです。

于 2013-10-09T13:38:11.523 に答える