If you wanted to share entire weights tensors, you could do…
conv2.weight = conv1.weight.t()

and then train as usual. PyTorch should combine the updates for conv1.weight and conv2.weight automatically and keep both weight tensors in sync without any fuss.
But you want to share only part of the weight tensors, so I think you are going to have to monitor the weight updates and combine them manually.
# store weights before update
w1 = conv1.weight[0,0].data
w2 = conv2.weight[0,0].data
# make update
optimizer.step()
# calculate updates
update1 = conv1.weight[0,0].data - w1
update2 = conv2.weight[0,0].data - w2
# combine updates
conv1.weight[0,0].data += update2.t()
conv2.weight[0,0].data += update1.t()