回答編集履歴

7

追記

2018/09/02 08:37

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -33,6 +33,8 @@
33
33
  shutil.rmtree(SAVE_PATH)
34
34
 
35
35
  os.mkdir(SAVE_PATH)
36
+
37
+ else: # この行を追加
36
38
 
37
39
  move_dir = Path(FLAGS.input_dir, FLAGS.move_dir)
38
40
 

6

アトミック操作は余談話になるので、回答内容から削除。

2018/09/02 08:37

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -78,23 +78,7 @@
78
78
 
79
79
  ※解説
80
80
 
81
- Windowsでは`shutil.move()`が内部で呼び出している`os.rename()`他のOS(macOS/Linux)と動作が違うとう点
81
+ Windowsでは`shutil.move()`が内部で呼び出している`os.rename()`がリネーム先ファイルが存在する時にOSErrorになる点が他のOS(macOS/Linux)と動作が違います
82
-
83
- 1, リネーム先ファイルが既に存在する場合にOSErrorになる。(質問文のエラー)
84
-
85
- 2, `CPython`内部で`MoveFileEX`を使っているため、リネーム処理がアトミック操作にならない。
86
-
87
- ◆参考情報
88
-
89
- - [Atomic function to rename a file](https://bugs.python.org/issue8828)
90
-
91
- - [posixmodule.c#internal_rename](https://github.com/python/cpython/blob/3.7/Modules/posixmodule.c#L4042)
92
-
93
- - [Is an atomic file rename (with overwrite) possible on Windows?](https://stackoverflow.com/questions/167414/is-an-atomic-file-rename-with-overwrite-possible-on-windows)
94
-
95
- - GO言語のIssue[os: make Rename atomic on Windows](https://github.com/golang/go/issues/8914)
96
-
97
- この2点です。
98
82
 
99
83
 
100
84
 
@@ -106,7 +90,7 @@
106
90
 
107
91
  憶測ですが、サンプルコード記載した人は`MacOS`か`linux`で動作テストを行い、質問者さんは`Windows`で動作させたことでこの事象が発生したのではないかと。
108
92
 
109
- Python言語においてクロスプラットフォーム環境でrename処理を行うには`os.replace`もしくは`Path#replace`を使ってくださいな。※Windows環境では、atomic操作は諦めてください。
93
+ Python言語においてクロスプラットフォーム環境でrename処理を行うには`os.replace`もしくは`Path#replace`を使ってくださいな。
110
94
 
111
95
 
112
96
 

5

補足

2018/08/30 04:59

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -80,11 +80,19 @@
80
80
 
81
81
  Windowsでは`shutil.move()`が内部で呼び出している`os.rename()`の他のOS(macOS/Linux)と動作が違うという点。
82
82
 
83
- 1,アトミック操作にならない
83
+ 1, リネーム先ファイルが既存在する場合にOSErrorに(質問文のエラー)
84
84
 
85
- 参考:[Atomic function to rename a file](https://bugs.python.org/issue8828)
85
+ 2, `CPython`内部で`MoveFileEX`を使っているため、リネーム処理がアトミック操作にならない。
86
86
 
87
+ ◆参考情報
88
+
87
- 2,リネーム先ファイルが存在したらOSErrorになる。
89
+ - [Atomic function to rename a file](https://bugs.python.org/issue8828)
90
+
91
+ - [posixmodule.c#internal_rename](https://github.com/python/cpython/blob/3.7/Modules/posixmodule.c#L4042)
92
+
93
+ - [Is an atomic file rename (with overwrite) possible on Windows?](https://stackoverflow.com/questions/167414/is-an-atomic-file-rename-with-overwrite-possible-on-windows)
94
+
95
+ - GO言語のIssue[os: make Rename atomic on Windows](https://github.com/golang/go/issues/8914)
88
96
 
89
97
  この2点です。
90
98
 
@@ -98,7 +106,7 @@
98
106
 
99
107
  憶測ですが、サンプルコード記載した人は`MacOS`か`linux`で動作テストを行い、質問者さんは`Windows`で動作させたことでこの事象が発生したのではないかと。
100
108
 
101
- Python言語においてクロスプラットフォーム環境でrename処理を行うには`os.replace`もしくは`Path#replace`を使ってくださいな。
109
+ Python言語においてクロスプラットフォーム環境でrename処理を行うには`os.replace`もしくは`Path#replace`を使ってくださいな。※Windows環境では、atomic操作は諦めてください。
102
110
 
103
111
 
104
112
 

4

参考リンクを追加

2018/08/30 04:53

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -78,7 +78,17 @@
78
78
 
79
79
  ※解説
80
80
 
81
- Windowsでは`shutil.move()`が内部で呼び出している`os.rename()`が**アトミック操作にならな**のが一つのポイントです
81
+ Windowsでは`shutil.move()`が内部で呼び出している`os.rename()`の他のOS(macOS/Linux)と動作違うとう点
82
+
83
+ 1,アトミック操作にならない。
84
+
85
+ 参考:[Atomic function to rename a file](https://bugs.python.org/issue8828)
86
+
87
+ 2,リネーム先ファイルが存在したらOSErrorになる。
88
+
89
+ この2点です。
90
+
91
+
82
92
 
83
93
  > File "C:\Users\kiara\Anaconda3\lib\shutil.py", line 544, in move
84
94
 

3

追記

2018/08/30 04:26

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -42,6 +42,10 @@
42
42
 
43
43
 
44
44
 
45
+ # 中略
46
+
47
+
48
+
45
49
  # 集めた画像データから顔が検知されたら、切り取り、保存する。
46
50
 
47
51
  for file_name in files:
@@ -55,6 +59,12 @@
55
59
  # 画像ファイル読込
56
60
 
57
61
  img = cv2.imread(str(src_file))
62
+
63
+
64
+
65
+ # 中略
66
+
67
+
58
68
 
59
69
  # 検出できたファイルは移動
60
70
 

2

追記

2018/08/30 02:35

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -42,13 +42,23 @@
42
42
 
43
43
 
44
44
 
45
+ # 集めた画像データから顔が検知されたら、切り取り、保存する。
46
+
47
+ for file_name in files:
48
+
49
+ src_file = Path(FLAGS.input_dir, file_name)
50
+
51
+ # ファイルの場合(ディレクトリではない場合)
52
+
53
+ if src_file.is_file():
54
+
45
- # 中略
55
+ # 画像ファイル読込
56
+
57
+ img = cv2.imread(str(src_file))
46
58
 
47
59
  # 検出できたファイルは移動
48
60
 
49
61
  if FLAGS.move_dir != "":
50
-
51
- src_file = Path(FLAGS.input_dir, file_name)
52
62
 
53
63
  src_file.replace(move_dir / file_name)
54
64
 

1

追記

2018/08/30 02:32

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -60,13 +60,15 @@
60
60
 
61
61
  Windowsでは`shutil.move()`が内部で呼び出している`os.rename()`が**アトミック操作にならない**のが一つのポイントです。
62
62
 
63
+ > File "C:\Users\kiara\Anaconda3\lib\shutil.py", line 544, in move
64
+
63
- > os.rename(src, real_dst)
65
+ > os.rename(src, real_dst)
64
66
 
65
67
 
66
68
 
67
- 憶測ですが、サンプルコード記載した人は`MacOS`か`linux`で動作テストを行い、質問者さんは`Windows`環境で動作させたことでこの象が発生したのではないかと。
69
+ 憶測ですが、サンプルコード記載した人は`MacOS`か`linux`で動作テストを行い、質問者さんは`Windows`で動作させたことでこの象が発生したのではないかと。
68
70
 
69
- クロスプラットフォーム環境で正しく動作させるには`os.replace`もしくは`Path#replace`を使ってください。
71
+ Python言語においてクロスプラットフォーム環境でrename処理を行うには`os.replace`もしくは`Path#replace`を使ってください
70
72
 
71
73
 
72
74